PDA

Просмотр полной версии : Работа с бинарным файлом


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

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

_nic
24.02.2008, 18:08
чет я вопроса не понял...
Какая разница какие там символы печатные или нет, ты работаеш с их кодом, поэтому все строковые функции работают. открывай через 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
покажи код.

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

#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лужебные->Таблица символов
....
в том то и дело что ты ищешь универсальной перекодировки .... которой не существует, по той причине , что только у символов английского языка "зарезервировано место" а у остальных языков "птичьи права"