Немного добавлю по этому поводу.
Например я считываю вот таким образом:
Перед основным считыванием файла я делаю прогонку цикла:
	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;
  }
}
И в стринггрид поячеечно записываются отдельные слова строки, которые отделяются между собой или пробелами или запятыми.