Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка файлов, Помогите,пожалуйста, с обработкой файлов 
:(
    Опции темы
skypark
Дата 4.11.2005, 12:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подсобите пожалуйста, а то я не могу найти подходящий учебник, где это было бы нормально описано.
Я никак не разберусь в работе с файлами (через потоки) в Си. Не пойму как отрабатываются признак конца файла ( 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



так попробуй.

Код

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


Не проверял.
PM MAIL   Вверх
Void
Дата 4.11.2005, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
maxim1000
Дата 4.11.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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

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



--------------------
qqq
PM WWW   Вверх
S.A.P.
Дата 4.11.2005, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



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

PM MAIL   Вверх
Void
Дата 4.11.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Perchilla
Пардон, я перепутал с вариантом get без параметров.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.