Немного добавлю по этому поводу.
Например я считываю вот таким образом:
Перед основным считыванием файла я делаю прогонку цикла:
int rowCount = 0; // kol-vo strok
while (!stream.atEnd()) {
stream.readLine();
rowCount++;
}
stream.seek(0);//Go to begin of file
таким образом через rowCount мы знаем кол-во строк в файле, полезно для того чтобы указать размер для модели или для того-же табле виджета.
Например у меня файл обычно состоим из 2 частей 1- это описательная часть, вторая столбцы данных.
Поэтому описательную часть перед основным циклом чтения я просто считываю вот так:
QString str1 = stream.readLine(); //chtenie stroki
QString str2 = stream.readLine(); //chtenie stroki
QString str3 = stream.readLine(); //chtenie stroki
QStringList fields = stream.readLine().split(","); //chtenie stroki
а потом распарсиваю.
а дальше все как писал Alchazar. Единственное можно указать явно кодировку:
QTextStream stream(&file);
stream.setCodec("CP-866");
В С++Билдере я делал когда-то вот так парсировку, не знаю, может и пригодиться
Т.е. на входе функции сама строка (А) и номер строки считывания (q)
void __fastcall TMainForm::WordZapolnenie(char*A, int q)
{
AnsiString S; // peremennaya zagolovka
int i; // schetchik cikla
char *Delitemes= " ,\n"; // ishet probeli i zapaytie
char *ptr;
ptr= strtok(A, Delitemes);
if (ptr)
StfForm->StringGrid1->RowCount+=1;
StfForm->StringGrid1->Cells[0][q-4]= ptr;
i= 1;
while (ptr)
{
ptr= strtok(NULL, Delitemes);
StfForm->StringGrid1->Cells[i][q-4]= ptr;
i+=1;
}
}
И в стринггрид поячеечно записываются отдельные слова строки, которые отделяются между собой или пробелами или запятыми.