Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Обработка файлов


Автор: skypark 4.11.2005, 12:46
Подсобите пожалуйста, а то я не могу найти подходящий учебник, где это было бы нормально описано.
Я никак не разберусь в работе с файлами (через потоки) в Си. Не пойму как отрабатываются признак конца файла ( ofstream.eof() ), и байт с кодом 0x0A.
Вот такой пример

#include <fstream.h>
#include <iostream.h>
void main (void)
{
ifstream fin("testin.dat");
ofstream fout1("testout1.dat");
ofstream fout2("testout2.dat");
unsigned char ch=0 , fcount=0;
while ( !fin.eof() )
{
fin >> ch; /* Чтение входных данных из файла */
fcount ++;
fout1 << "0x" << hex << int(ch) << " ";
fout2 << ch ;
}
fout1 << '#';
fout2 << char(0x0A);
fin.close();
fout1.close();
fout2.close();
cout << "Read " << int(fcount) << " bytes." << endl;
cin >> ch; //waiting Enter
}

Вот такой входной файл testin.dat
0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0D 0x0A 0x33 0x35

А на выходе я имею
testout1.dat содержит такой текст
0x31 0x31 0x32 0x31 0x31 0x31 0x32 0x33 0x35 0x35

testout2.dat последовательность кодов
0x31 0x31 0x32 0x31 0x31 0x31 0x32 0x33 0x35 0x0D 0x0A
Кудато подевался символ с кодом 0x20 и байты 0x0D 0x0A из входного файла
Кроме того вместо одного байта 0x0A в конце файла влез еще и 0x0D.

Если переписать подругому оператор чтения из файла ( строка с комментарием
/* Чтение входных данных из файла */ ) на
ch=fin.get();

то результат немного изменяется
testout1.dat
0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0A 0x33 0x35 0xff

testout2.dat
0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0D 0x0A 0x33 0x35 0xFF 0x0D 0x0A

Пробел (0x20) появился. Байты 0x0D 0x0A читаются как один 0x0A, однако при
записи в выходной файл их опять становится два. И что это за 0x255 (конец
файла чтоли), и как от него избавиться.

Объясните пожалуйста, или ссылочку на инфу об этом дайте. А то что-то совсем туго.

Автор: S.A.P. 4.11.2005, 14:13
так попробуй.

Код

while ( fin.get(ch) )
{
  fcount ++; 
  fout1 << "0x" << hex << int(ch) << " ";
  fout2.put(ch) ;
}


Не проверял.

Автор: Void 4.11.2005, 15:56
Perchilla
Не пойдет. istream::get при достижение конца файла возвращает istream::traits_type::eof, а вовсе не 0.

Автор: maxim1000 4.11.2005, 16:00
по умолчанию файлы открываются в текстовом режиме, орн производит некоторую предобработку (связанную со всякими началами строк и т.д.)
для того, чтобы читать в точности то, что записано в файле, его стоит открыть в бинарном режиме:
Код

ifstream fin("testin.dat",iostream::binary);

Автор: S.A.P. 4.11.2005, 16:14
Цитата(Void @ 4.11.2005, 15:56)
Не пойдет. istream::get при достижение конца файла возвращает istream::traits_type::eof, а вовсе не 0.
get вернет ссылку на fin, а тот в свою очередь приводится в 0. По крайней мере все время так делал.

Автор: Void 4.11.2005, 16:54
Perchilla
Пардон, я перепутал с вариантом get без параметров.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)