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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Коррекировка текстового файла [РЕШЕНО]  (Прочитано 1789 раз)
TsysarAndrew
Гость
« : Июнь 18, 2014, 02:03 »

Добрый день!
Пытаюсь провести анализ текстовых файлов, одной из задач является привязка полученных данных к номерам строк. Временами попадаются файлы, в которых на конце строки где-то стоит CR LF, а где-то просто CR. При чтении файла в таких ситуациях последовательность CR CR LF читается не как две строки, а как одна. В итоге идет неверная привязка данных к номерам срок в файле. Может это правильно, но, например, notepad++ отображает две строки, поэтому при анализе результатов возникает путаница.

Решил сначала менять в файле CR CR на CR LF CR, а потом делать анализ. Написал следующий код:
Код:
QFile file_(path + filename);
QFile tempFile(path + "temp.bin");

QByteArray f_bytes;

QByteArray wrongBytes;
wrongBytes.append(0x0d);
wrongBytes.append(0x0d);

QByteArray writeBytes;
writeBytes.append(0x0d);
writeBytes.append(0x0a);
writeBytes.append(0x0d);

if(file_.open(QIODevice::ReadOnly))
{
f_bytes = file_.readAll();
f_bytes.replace(wrongBytes, writeBytes);

if(tempFile.open(QIODevice::WriteOnly))
{
tempFile.write(f_bytes);
tempFile.close();
}
}

Таким образом в файл temp.bin не пишутся символы CR, только LF, "строки с неправильным переносом" теряются. Убирал вызов f_bytes.replace, ничего не поменялось.   Далее не знаю куда именно копать, т.к. опыта работы с QT (и С++) не много. Подскажите, как можно решить описанную проблему?
« Последнее редактирование: Июнь 18, 2014, 23:13 от TsysarAndrew » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июнь 18, 2014, 09:10 »

Сделать все концы строк однообразными, напр как у Вындоуз (0xd0xa)
Код
C++ (Qt)
void SetWinEOL( const QByteArray & src, QByteArray & dst )
{
int last = src.size() - 1;
for (int i = 0; i < src.size(); ++i) {
 char ch = src[i];
 switch (ch) {
  case 0xd:
   dst += ch;
   if (i == last || src[i + 1] != 0xa)
    dst += 0xa;
   break;
 
  case 0xa:
   if (i == 0 || src[i - 1] != 0xd)
    dst += 0xd;
   dst += ch;
   break;
 
  default:
   dst += ch;
 }
}
}
« Последнее редактирование: Июнь 18, 2014, 09:12 от Igors » Записан
TsysarAndrew
Гость
« Ответ #2 : Июнь 18, 2014, 23:11 »

Спасибо, помогло.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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