Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› tellg()
Посл.ответ Сообщение

Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 25 декабря 2010 18:52 · Поправил: gena-m
· Личное сообщение · #1

Пишу парсер, столкнулся с такой ерундой - код:

Code:
  1. file.open("rtrace.txt");
  2.   if(!file){
  3.                         AfxMessageBox("Файл открыть не удалось!!!!!!!");
  4.                         return;
  5.            };
  6.   filewrite.open("rtrace1.txt",ios::binary);//создание выходного файла
  7.   while(!file.eof()){//читаем пока не конец
  8.                      int a=0;
  9.                      int pointerpos;
  10.                      pointerpos=file.tellg();
  11.                      file.getline(s,sizeof(s));//получение строки
  12.                      //a=findcallret(s);//поиск комбинации CALL INC RET
  13.                      //if (a==0){//если поиск комбинации CALL INC RET не обнаружен производим запись
  14.                                a=strlen(s);
  15.                                s[a]=0x0d;
  16.                                s[a+1]=0x0a;
  17.                                s[a+2]=0x0;
  18.                                filewrite.write(s,a+2);
  19.                               //}
  20.                     }
  21.   file.close();
  22.   filewrite.close();
  23.   AfxMessageBox("Пипец");

если коментирую строку: pointerpos=file.tellg(); тогда все нормально, если использую получение указателя получается пропадают первые знаки на выходе:

Code:
  1. 00411EC5     CALL    UnPackMe.0041203B                 ; ESP=0012FF74
  2. 0041203B     ADD     DL, DL                            ; EDX=7C90EB80
  3. 0041203D     JMP     SHORT UnPackMe.00412041
  4. 0412041     JNZ     SHORT UnPackMe.00412054                                   //здесь потерян 0 в адресе
  5. 00412054     JMP     SHORT UnPackMe.00412058
  6. 00412058     RETN                                      ; ESP=0012FF78
  7. 00411ECA     JMP     SHORT UnPackMe.00411ECE
  8. 0411ECE     ADC     AL, AL                            ; FL=CPZO, EAX=00000000 //здесь потерян 0 в адресе
  9. 00411ED0     JMP     SHORT UnPackMe.00411ED4
  10. 00411ED4     JNB     SHORT UnPackMe.00411EC1
  11. 00411ED6     JMP     SHORT UnPackMe.00411EDA


может что то неправильно делаю с tellg()

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 25 декабря 2010 19:24 · Поправил: reversecode
· Личное сообщение · #2

ну ум приходят мысли о том что винда(iostream) может синхронизировать по \n\r а ты думаешь что там \n
ну или наоборот
посмотри в хекс редакторе какие там символы в начале файла



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 25 декабря 2010 22:07
· Личное сообщение · #3

Накопал только что tellg() влияет на позицию в буфере потока, т.е. что его применение вызывает "прыганье" указателя (что мы и имеем по факту), дефект повторяется примерно каждые 200 строк, как это обойти - непонятно, ладно пойдем пока другим путем т.е. без применения tellg().
reversecode
И в оригинале и в файле на выходе используются 0D0A, что использует поток х.з.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 25 декабря 2010 22:19 · Поправил: reversecode
· Личное сообщение · #4

значит iostream использует \n(0x0A)

gena-m пишет:
дефект повторяется примерно каждые 200 строк,

это может быть размером внутреннего буффера iostream

Code:
  1. -     file.open("rtrace.txt");
  2. +     file.open("rtrace.txt", ios::binary);

должно решить проблему
binary игнорирует \n \r и итд



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 25 декабря 2010 22:57
· Личное сообщение · #5

Да, действительно, все стало на свои места, спасибо reversecode.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше



 eXeL@B —› Программирование —› tellg()
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати