Russian Qt Forum
Ноябрь 01, 2024, 08:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Читать текстовый файл построчно. Чем?  (Прочитано 11259 раз)
smartchecker
Гость
« : Декабрь 02, 2009, 00:12 »

Нужно прочитать текстовый файл построчно и вывести в окно.
Подредактировать (распарсить по словам и что-то поменять) и записать обратно в файл, но длина строки пожет быть не более 80 символов.
Как я понимаю тут участвуют QTextFile QTextCursor и что-то ещё...
Растолкуйте.
Записан
Alchazar
Гость
« Ответ #1 : Декабрь 02, 2009, 14:21 »

Вот, немного погуглил:
Код
C++ (Qt)
QFile file("MyFile.txt");
 QString line;
 if ( file.open(IO_ReadOnly | IO_Translate) )
 {      
   // file opened successfully
   QTextStream t( &file );        // use a text stream
   // until end of file...
   while ( !t.eof() ) {          
     // read and parse the command line
     line = t.readLine();         // line of text excluding '\n'
     // do something with the line
     ...
   }
   // Close the file
   file.close();
 }
 
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Декабрь 02, 2009, 16:59 »

правильнее всё таки не "Чем?", а "Как?". Т.к. В Qt, и, возможно, где-то ещё, Нет классов, которые выполняют обширный круг задач автоматически, есть только классы выполняющие почти элементарные функции, из которых строится программа.
« Последнее редактирование: Декабрь 02, 2009, 17:01 от lit-uriy » Записан

Юра.
_Vitaliy_
Гость
« Ответ #3 : Декабрь 13, 2009, 12:21 »

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


Страница сгенерирована за 0.362 секунд. Запросов: 23.