2015-06-04 4 views
0

Я уверен, что это очень простая задача, однако я очень новичок в C++, поэтому для меня это немного сложно.Чтение C++ в текстовом файле в виде матрицы в 2D-массив, сохраняя только числовые блоки

Во всяком случае, у меня есть текстовый файл, который уже находится в форме массива 25x14 (или больше, как только я получу код). К сожалению, некоторые строки имеют только одну запись, которая является словом.

То, что я хочу сделать, это пройти через текстовый файл и отобразить все записи (за исключение строки со словом на них) в простой массив в C++, так что я могу создать гистограммы и т.д.

Я планирую делая это с помощью функции isdigit().

вот что я до сих пор:

using namespace std; 

int main() 
{ 
    int str; 
    int matrix[25][14]; 

    ifstream inFile("inputfile.txt"); 

    while (inFile >> str) { 
     for (int i = 0; i < 25; i++) { 
      for (int j = 0; j < 14; j++) {     
       if (isdigit(inFile)) { 
        inFile >> matrix[i][j]; 
       } 
      } 
     } 
    } 
} 

Что, безусловно, дает много ошибок. Моя проблема в том, что мне нужна некоторая функция, которая смотрит на файл txt на одно слово (обозначенное пробелами) за раз.

Любые предложения?

Благодаря

ответ

0

Вы можете сделать это вот так:

Сначала определим простую функцию:

bool is_a_bad_line(const std::vector<int>& l) 
{ 
    return l.size() < 14; 
} 

Тогда:

std::vector< std::vector<int> > data; 
std::ifstream f("inputfile.txt"); 
std::string line; 
while(std::getline(f,line)) 
{ 
    std::vector<int> line_data; 
    std::istringstream iss(line); 
    int value; 
    while(iss >> value) 
    line_data.push_back(value); 
    data.push_back(line_data); 
} 
std::remove_if(data.begin(), data.end(), is_bad_line); 

vector См, istringstream и remove_if algorithm хорошо понимать поведение.

+0

Почему бы не проверить 'line.size() = 14' после цикла while и только затем push_back, а не добавлять, а затем тестировать и удалять в конце? – user4581301

+0

Спасибо! Я, наконец, получил его для работы, используя то, что вы предложили, спасибо! – khfrekek

+0

@ user4581301: это для модульности. С помощью этой реализации легко изменить контейнер или изменить ограничения на удаленные строки. Но решение внутри цикла тоже правильно. Фактически, я сделал ошибку в вызове 'std :: remove_if', теперь она исправлена. – Caduchon

0

пусть ваш файл имеет 2 номера на каждой линии

1 2 
2 3 
4 5 

станд :: istringstream будет получить номера и хранить их в переменной

#include <sstream> 
#include <string> 

std::string line; 
while (std::getline(infile, line)) 
{ 
    std::istringstream iss(line); 
    int a, b; 
    if (!(iss >> a >> b)) { break; } // error 

    // process pair (a,b) 
} 

я знаю его не но может помочь вам

 Смежные вопросы

  • Нет связанных вопросов^_^