Работа с бинарным файлом

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 24 Feb 2008.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Есть бинарный файл на треть состоящий из обычных текстовых символов.Естественно что такие ф-ции как strstr strtok и им подобные использовать неудается.Как можно из этого файла "выпотрошить" текст который там содержится?
     
  2. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    чет я вопроса не понял...
    Какая разница какие там символы печатные или нет, ты работаеш с их кодом, поэтому все строковые функции работают. открывай через rb и работай
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я уже так пытался.Вообщем я имею в виду этот файл Х:\Documents and Settings\user\Application Data\ICQ\номераськи\номераськи.FB
    Если его открывать через fopen(с параметром чтения rb ) и читать fread ,то ниче кроме "AOL Feedbag 1.1" все ф-ции для работы с текстом невидят :(
    ЗЫ:файл от оф. асику клиента 6й версии
     
  4. zythar

    zythar Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    хз получится или нет потому что код юниховы.

    Code:
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main()
    {
        int d,sz;
        char buffer[1024];
        d=open("путь_к_файлу", O_RDRW);
        while ((sz=read(d, buffer, 1024))>0) {
            /*твои действия*/
        };
        return 0;
    }
    
    а вообще прально. нет разницы какой тип файла когда его открываешь, так что в принципе все должно работать
     
    #4 zythar, 24 Feb 2008
    Last edited: 24 Feb 2008
  5. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    покажи код.

    Вот те для примера прога для конвертации бинарных файлов
    Code:
    #include <stdio.h>
    #include <IO.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      if(argc < 2)
                return printf("USE: %s file_path\n", argv[0]);
      FILE *fr, *fw;
      fr=fopen(argv[1], "rb");
      fw=fopen("result.txt", "wb");
      if(!fr || !fw)
             return printf("Open file error\n");
      int size=filelength(fileno(fr));
      unsigned char c;
      while(size > 0)
      {
                 c=fgetc(fr);
                 printf("\\0x%X", c);
                 fprintf(fw, "\\0x%X", c);
                 size--;
      }
      fclose(fw);
      fclose(fr);
      system("result.txt");
      remove("result.txt");
      return 0;
    }
    
     
    #5 nc.STRIEM, 24 Feb 2008
    Last edited: 24 Feb 2008
  6. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Пример какай то странный .Я его вот так изменил
    Code:
    main()
    {
    char a[256];
    ExpandEnvironmentStrings("%HOMEPATH%",a,256);
    strcat(a,"\\Application Data\\ICQ\\208190791\\208190791.FB");
    FILE *fr, *fw;
    fr=fopen(a, "rb");
    fw=fopen("result.txt", "wb");
    int size=filelength(fileno(fr));
    unsigned char c;
    while(size > 0)
    {
    c=fgetc(fr);
    printf("\\0x%X", c);
    fprintf(fw, "\\0x%X", c);
    size--;
    }
    fclose(fw);
    fclose(fr);
    system("result.txt");
    remove("result.txt");
    return 0;
    }
    
    В и тоге он мне в stdout выдает бесконечный поток \0xFF :confused:

    А вот и мой код
    Code:
    #include <windows.h>
    #include <iostream.h>
    #include <stdio.h>
    #include <conio.h>
    int stf(char *buf=new char[1024*10])
    {
    int sz,n,stop;
    char a[256];
    DWORD szf,rb;
    char *buf2=new char[1024*10];
    ExpandEnvironmentStrings("%HOMEPATH%",a,256);
    strcat(a,"\\Application Data\\ICQ\\208190791\\208190791.FB");
    HANDLE h=CreateFile(a,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
    szf=GetFileSize(h,0);
    stop=0;
    ReadFile(h,buf2,szf,&rb,NULL);
    for(;;)
    {
    if(strlen(buf2)>0)
    {
    strcat(buf,buf2);
    buf2+=strlen(buf2);
    }
    if(strlen(buf2)==0)
    {
    buf2+=1;
    stop++;
    }
    if((strlen(buf))+stop==szf)
    {
    break;
    }
    }
    CloseHandle(h);
    return(szf);
    }
    main()
    {
    char *a=new char[1024*10];
    cout<<stf(a)<<"\n";
    printf(a);
    getch();
    }
    
    Но он кроме текста выводит ещё кучу левого мусора :( Может у кого есть идеи как от него исбавится?
     
    #6 _nic, 24 Feb 2008
    Last edited: 24 Feb 2008
  7. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    не туда копаешь!
    разберись что есть МУСОР!!!!
    если мусор это корябушки КОИ-8 отображающиеся в 1251, или наоборот.... или DOS кодировка,
    то с твоим определением мусора можно не согласится!
    Ты запросто мог отфильтровать свой ВЫВОД по коду символа обратившись к таблице
    Пуск->Программы->Стандартные->cлужебные->Таблица символов
    ....
    в том то и дело что ты ищешь универсальной перекодировки .... которой не существует, по той причине , что только у символов английского языка "зарезервировано место" а у остальных языков "птичьи права"
     
    #7 Delimiter, 26 Feb 2008
    Last edited: 27 Feb 2008