2013-11-17 3 views
0

Я пытаюсь прочитать из файла с терминала. Первая и вторая строки файла состоят из номера строки и столбца. В то время как другие строки состоят из содержимого символьного символа. Я смог прочитать первую и вторую строки и сохранить их значения и соответственно присвоить размер матрицы. Но я не могу понять, как читать оставшуюся часть.Чтение из файла char с помощью char в C++

#include <iostream> 
    #include <fstream> 

    using namespace std; 

int main(int argc, char *argv[]) 
{ 
ifstream f; 
f.open(argv[1]); 

int row, col; 


f >> row; 
f >> col; 

char matrix[row][col]; 
char c; 
int i = 0, j = 0; 


while (!f.eof()) { 

    //TODO 
} 

f.close(); 

return 0; 
} 

edit1: Содержимое файла:

11 
11 
X XXXXXXXXX 
X X  X 
X XXXXX X X 
X  X X X 
XXXXX XXX X 
X X X X 
X X XX X X 
X X  X X 
X XXXXXXX X 
X   X 
XXXXXXXXXXX 
+1

Читать 'col' количество символов' row' количество раз. Используйте цикл, чтобы сделать это, проверьте успех после каждого чтения и выхода из цикла, это ошибка. И не используйте 'eof' как условие цикла, это [почти всегда неправильно] (http://stackoverflow.com/questions/20030925/read-from-file-char-by-char-in-c). – jrok

+0

Вы хотите предположить, что матрица содержит правильное количество элементов ('row' x' col')? Что, если у него больше? Или меньше? – Beta

+0

Да, он будет содержать точные числа строк и столбцов – user2878007

ответ

2

Попробуйте это:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <vector> 

int main(int argc, char *argv[]) 
{ 
    std::vector<std::string> v; 
    std::ifstream in(argv[1]); 
    std::string line; 

    int row, col; 
    in >> row >> col; 

    while (std::getline(in, line)) 
    { 
     if (!line.empty()) 
      v.push_back(line); 
    } 
} 
+0

Отлично! Но просто измените argv [0] на argv [1] – user2878007

+0

@ user2878007 Конечно: D – 0x499602D2

1

Вы не отображающие содержимое файла, поэтому я предполагаю, что это должно работать:

int i,j; 

for(i=0; i < row; ++i) 
for(j=0; j < col; ++j) 
    f >> matrix[i][j] ; 

Нет необходимости проверять конец файл, если файл имеет ровно row*col символов, разделенных пробелом

В соответствии с вашим обновленный позе вам нужно прочитать белое пространство слишком Так попробуйте это,

for(i=0; i < row; i++) 
for(j=0; j < col; j++) 
    f >> std::noskipws >> matrix[i][j] ; // Don't skip white-space 

Я не проверял это, но я предполагаю, что вы, возможно, придется сделать некоторые другие твики (может быть увеличивать строку 12).

Кроме того, чтобы очистить использование в noskipws флаг f.unsetf(ios_base::skipws);

+0

У меня мусор в соответствии с вашим кодом. – user2878007

+0

@ user2878007 показать содержимое файла – P0W

+0

@ user2878007 Вы не указали свой входной файл (только что описал его, плохо) Что вы ожидали? Плакаты здесь очень хорошие, но у них нет психических сил. – john

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