Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Help with File Processing!!!

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

Объясните пожалуйста, или ссылочку на инфу об этом дайте. А то что-то
совсем туго.
270
04 ноября 2005 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by skypark
Подсобите пожалуйста, а то я не могу найти подходящий учебник, где это было бы нормально описано.
Я никак не разберусь в работе с файлами (через потоки) в Си. Не пойму как отрабатываются признак
конца файла ( 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 (конец
файла чтоли), и как от него избавиться.

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



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

13K
04 ноября 2005 года
skypark
7 / / 04.11.2005
Цитата:
Originally posted by Drew
ifstream fin("testin.dat",ios::binary);



Я так пробовал, но это ничего не меняет.
Все равно при использовании
fin >> ch;
теряются управляющие символы 0x0d 0x0a
а если
ch=fin.get();
то в конце файла читается еще какой-то 0xFF,
какбудто сначала считывается признак конца файла как конкретный байт, а уже потом выставляется признак конца файла в потоке.
Как с этим правильно бороться?

270
04 ноября 2005 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by skypark
Я так пробовал, но это ничего не меняет.
Все равно при использовании
fin >> ch;
теряются управляющие символы 0x0d 0x0a
а если
ch=fin.get();
то в конце файла читается еще какой-то 0xFF,
какбудто сначала считывается признак конца файла как конкретный байт, а уже потом выставляется признак конца файла в потоке.
Как с этим правильно бороться?



fin.read([адрес буфера],[количество символов])
fin.close

13K
04 ноября 2005 года
skypark
7 / / 04.11.2005
Цитата:
Originally posted by Drew
fin.read([адрес буфера],[количество символов])
fin.close



А в таком варианте счетчик считанных байт fcount показывает 13 (на самом деле во входном файле 12 байт). А в выходном файле testout1.dat имеем

0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0d 0x0a 0x33 0x35 0x35

т.е. в конце два раза повторяется последний байт входного файла.

Может я не правильно понимаю как надо вользоваться признаком конца файла fin.eof() ?

270
04 ноября 2005 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by skypark
А в таком варианте счетчик считанных байт fcount показывает 13 (на самом деле во входном файле 12 байт). А в выходном файле testout1.dat имеем

0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0d 0x0a 0x33 0x35 0x35

т.е. в конце два раза повторяется последний байт входного файла.

Может я не правильно понимаю как надо вользоваться признаком конца файла fin.eof() ?



ifstream ins(path_in,ios::in|ios::binary|ios::trunc);
cout << "Обрабатывается " << path_in;
if(ins)
{
ofstream os(path_out,ios::in|ios::binary);
if(os)
{
while(!ins.getline(buf1,87).eof())
{
p=buf1;
*(buf1+83)='\x0d'; //меняются ПОСЛЕДНИЕ 2 символа ||
*(buf1+84)='\x0a'; //на ВК/ПС
counter++;
os << buf1;
}
os.close();
cout << " Обработано " << counter << " строк" << endl;
}
else
cout << path_out << " :Не могу открыть для преобразования" << endl;
}
else
cout << " :не обнаружен" << endl;
ins.close();

кусочек кода... когда-то делал... посмотри

13K
04 ноября 2005 года
skypark
7 / / 04.11.2005
Цитата:
Originally posted by Drew
...

while(!ins.getline(buf1,87).eof())
{
...
}
...
кусочек кода... когда-то делал... посмотри



Но тут помоему немножко другая ситуация.
В даном куске из файла данные читаются построчно (т.е. целыми кусками кусками какой-то длины).
И я так понимаю, что если оставшийся кусок файла, по каким-то причинам будет недостаточной длины, то он проигнорируется.
А как быть если надо читать побайтно (т.е.строками по 1 байту)?

Я могу это сделать другими методами (например библиотекой io.h функции open,read и т.д.), просто я хочу разобраться с этой ситуацией.
Откуда там берётся 0xFF, или почему вообще из потока (в данном случае из файла на диске) читается на 1 байт больше?

270
04 ноября 2005 года
Drew
265 / / 20.07.2000
ей богу мне лень разбираться

вот файлик, который преобразует файл в символьный шестнадцатиричный вид чтобы из Васика создать ПУСТОЙ DBF файл
13K
04 ноября 2005 года
skypark
7 / / 04.11.2005
Цитата:
Originally posted by Drew
ей богу мне лень разбираться

вот файлик, который преобразует файл в символьный шестнадцатиричный вид чтобы из Васика создать ПУСТОЙ DBF файл



Спасибо. Метод понял.

Только не совсем понятно почему там так получается.Я просто пытался с потоком разобраться.
Нету у меня инфы достойной (на English я слабо отдупляюсь в таких непростых вопросах). А на русском все както слабо отводят этому вопросу внимание. Все как-то вскольз.

488
04 ноября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by skypark
Только не совсем понятно почему там так получается.Я просто пытался с потоком разобраться.

Цикл неправильно организован.

 
Код:
while(fin.read(&ch,1))
  {
    fout1 << "0x" << hex << int(ch) << " ";
    fout2 << ch ;
    fcount ++;
  }
270
05 ноября 2005 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by Mоngооsе
Цикл неправильно организован.
 
Код:
while(fin.read(&ch,1))
  {
    fout1 << "0x" << hex << int(ch) << " ";
    fout2 << ch ;
    fcount ++;
  }



это ещё почему?
твоё ТАКОЕ посимвольное чтение топает полтора часа

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог