2011-01-26 5 views
0

Хотя я подозреваю, что знаю ответ, меня будут интересовать ответы людей.Чтение двоичных файлов

В настоящее время у меня есть приложение VC6 работает на W2K3, который считывает текстовый файл, используя следующий (упрощенный код):

string line; 
ifstream infile("test.txt",ios::in); 
while (!infile.eof()) 
{ 
    getline(infile,line); 
} 
... 

Каждая запись в файле содержит поля, которые являются трубы разделителями и код работает отлично благодаря CRLF, хотя поля и записи не являются фиксированной длиной. Теперь проблема заключается в том, что файл будет бинарным, поскольку некоторые данные будут неподписанными упакованными десятичными в дополнение к тексту. В принципе, код выше все еще действителен, если открыт как двоичный файл (разделители и LF сохранены)? Я пробовал быстрый тест с некоторыми фиктивными данными и, похоже, вел себя одинаково.

Насколько я понимаю, бинарные файлы считываются с помощью знания содержимого данных, поэтому байты могут быть правильно восстановлены и без LF. Я искал в Интернете и нашел различные варианты для C++ и других языков .NET (опция), но ни один из них не способен читать одну строку за раз - даже если данные с переменным размером и LF, похоже, используя двоичный файл - и я не хочу читать весь файл за один выстрел, так как он может быть довольно большим (надеясь, что не будет читать один символ за раз).

Так что, если вышеуказанное может быть действительным, существует ли риск потери данных? Если это не так, будут оценены другие варианты. И если мне что-то не хватает, пожалуйста, не стесняйтесь уточнять.

ответ

0

Если вы полагаетесь на строки, ограниченные CRLF, тогда, если двоичные данные имеют CRLF, вы получите ложный разрыв строки. Кроме того, если двоичные данные содержат значение 124 (вертикальная труба), у вас будут проблемы с определением столбцов.

+0

Согласовано, но предполагается, что LF и трубы не являются частью «данных», поэтому их можно использовать в качестве разделителей полей и линий. – user589918

+0

Я долгое время не работал в упакованном десятичном формате, но вы действительно можете гарантировать, что у вас никогда не будет последовательности байтов '0000 1101',' 0000 1010' или '0111 1100'? 'getline' будет искать один или оба из первых двух (в зависимости от того, что вы называете), и ваш алгоритм split будет искать последний. –

+0

Я не парень C, поэтому я не знаю 'getline' слишком хорошо, но в C#/VB мы будем использовать' StreamReader' для чтения файла в виде текста, и когда вы скажете ему, какая кодировка (ASCII/UTF8/и т. Д.), Он должен использовать для синтаксического анализа необработанных байтов. Пока кодирование поддерживает чтение байтов, вы можете работать со строкой. Убедитесь, что вы знаете о кодировке. ASCII будет 1 байт/символ, но UT8 может быть от 1 до 6 байтов/символов. –

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