Help with File Processing!!!
Я никак не разберусь в работе с файлами (через потоки) в Си. Не пойму как отрабатываются признак
конца файла ( 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 (конец
файла чтоли), и как от него избавиться.
Объясните пожалуйста, или ссылочку на инфу об этом дайте. А то что-то
совсем туго.
Подсобите пожалуйста, а то я не могу найти подходящий учебник, где это было бы нормально описано.
Я никак не разберусь в работе с файлами (через потоки) в Си. Не пойму как отрабатываются признак
конца файла ( 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);
ifstream fin("testin.dat",ios::binary);
Я так пробовал, но это ничего не меняет.
Все равно при использовании
fin >> ch;
теряются управляющие символы 0x0d 0x0a
а если
ch=fin.get();
то в конце файла читается еще какой-то 0xFF,
какбудто сначала считывается признак конца файла как конкретный байт, а уже потом выставляется признак конца файла в потоке.
Как с этим правильно бороться?
Я так пробовал, но это ничего не меняет.
Все равно при использовании
fin >> ch;
теряются управляющие символы 0x0d 0x0a
а если
ch=fin.get();
то в конце файла читается еще какой-то 0xFF,
какбудто сначала считывается признак конца файла как конкретный байт, а уже потом выставляется признак конца файла в потоке.
Как с этим правильно бороться?
fin.read([адрес буфера],[количество символов])
fin.close
fin.read([адрес буфера],[количество символов])
fin.close
А в таком варианте счетчик считанных байт fcount показывает 13 (на самом деле во входном файле 12 байт). А в выходном файле testout1.dat имеем
0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0d 0x0a 0x33 0x35 0x35
т.е. в конце два раза повторяется последний байт входного файла.
Может я не правильно понимаю как надо вользоваться признаком конца файла fin.eof() ?
А в таком варианте счетчик считанных байт 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();
кусочек кода... когда-то делал... посмотри
...
while(!ins.getline(buf1,87).eof())
{
...
}
...
кусочек кода... когда-то делал... посмотри
Но тут помоему немножко другая ситуация.
В даном куске из файла данные читаются построчно (т.е. целыми кусками кусками какой-то длины).
И я так понимаю, что если оставшийся кусок файла, по каким-то причинам будет недостаточной длины, то он проигнорируется.
А как быть если надо читать побайтно (т.е.строками по 1 байту)?
Я могу это сделать другими методами (например библиотекой io.h функции open,read и т.д.), просто я хочу разобраться с этой ситуацией.
Откуда там берётся 0xFF, или почему вообще из потока (в данном случае из файла на диске) читается на 1 байт больше?
вот файлик, который преобразует файл в символьный шестнадцатиричный вид чтобы из Васика создать ПУСТОЙ DBF файл
ей богу мне лень разбираться
вот файлик, который преобразует файл в символьный шестнадцатиричный вид чтобы из Васика создать ПУСТОЙ DBF файл
Спасибо. Метод понял.
Только не совсем понятно почему там так получается.Я просто пытался с потоком разобраться.
Нету у меня инфы достойной (на English я слабо отдупляюсь в таких непростых вопросах). А на русском все както слабо отводят этому вопросу внимание. Все как-то вскольз.
Только не совсем понятно почему там так получается.Я просто пытался с потоком разобраться.
Цикл неправильно организован.
{
fout1 << "0x" << hex << int(ch) << " ";
fout2 << ch ;
fcount ++;
}
Цикл неправильно организован.
{
fout1 << "0x" << hex << int(ch) << " ";
fout2 << ch ;
fcount ++;
}
это ещё почему?
твоё ТАКОЕ посимвольное чтение топает полтора часа