Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Работа с бинарным файлом (https://forum.antichat.xyz/showthread.php?t=62623)

_nic 24.02.2008 17:17

Работа с бинарным файлом
 
Есть бинарный файл на треть состоящий из обычных текстовых символов.Естественно что такие ф-ции как strstr strtok и им подобные использовать неудается.Как можно из этого файла "выпотрошить" текст который там содержится?

nc.STRIEM 24.02.2008 17:54

чет я вопроса не понял...
Какая разница какие там символы печатные или нет, ты работаеш с их кодом, поэтому все строковые функции работают. открывай через rb и работай

_nic 24.02.2008 18:08

Цитата:

Сообщение от nc.STRIEM
чет я вопроса не понял...
Какая разница какие там символы печатные или нет, ты работаеш с их кодом, поэтому все строковые функции работают. открывай через rb и работай

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

zythar 24.02.2008 18:18

хз получится или нет потому что код юниховы.

Код:

#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;
}

а вообще прально. нет разницы какой тип файла когда его открываешь, так что в принципе все должно работать

nc.STRIEM 24.02.2008 18:20

покажи код.

Вот те для примера прога для конвертации бинарных файлов
Код:

#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;
}


_nic 24.02.2008 18:54

Цитата:

Сообщение от nc.STRIEM
покажи код.

Вот те для примера прога для конвертации бинарных файлов
Код:

#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;
}


Пример какай то странный .Я его вот так изменил
Код:

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:

А вот и мой код
Код:

#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();
}

Но он кроме текста выводит ещё кучу левого мусора :( Может у кого есть идеи как от него исбавится?

Delimiter 26.02.2008 22:35

не туда копаешь!
разберись что есть МУСОР!!!!
если мусор это корябушки КОИ-8 отображающиеся в 1251, или наоборот.... или DOS кодировка,
то с твоим определением мусора можно не согласится!
Ты запросто мог отфильтровать свой ВЫВОД по коду символа обратившись к таблице
Пуск->Программы->Стандартные->cлужебные->Таблица символов
....
в том то и дело что ты ищешь универсальной перекодировки .... которой не существует, по той причине , что только у символов английского языка "зарезервировано место" а у остальных языков "птичьи права"


Время: 17:01