Скопировать в AnsiString
Мне нужно скопировать в переменную AnsiString или char большой файл(2-5 Mb). Возможно ли это?
а почему нет? что тебя смущает?
Ну а как это сделать?
char ch;
AnsiString str="";
FILE *f;
AnsiString pathf="c:\\Close.bat";
if((f=(FILE *)fopen(pathf.c_str(),"r"))!=NULL)
{fseek(f, 0, SEEK_SET);
for(ch = fgetc(f);ch!=EOF;)
{str=str+ch;
ch = fgetc(f);
}
fclose(f);
}
после этого места в AnsiString уже ничё не заносится, так как '\0' обозначает конец AnsiString.
Получается, что файл в AnsiString скопировать нельзя, так первый попавшийся в файле NULL обрежет AnsiString. :(
Ммда... проблема, как я понимаю в том, что как только в копируемом файле появляется значок NULL,
после этого места в AnsiString уже ничё не заносится, так как '\0' обозначает конец AnsiString.
Получается, что файл в AnsiString скопировать нельзя, так первый попавшийся в файле NULL обрежет AnsiString. :(
на самом деле в AnsiString все можно затолкать в т.ч. и '\0' прямо в середину, а вот проблемы могут возникнуть при посивольном считывании так как это сделал Tristan. Дело в том что символ EOF есть '\0xff' так что если он встретиться в файле ( а это очень вероятно ) чтение на этом прекратиться.
Могу предложить следущее решение:
char *buf=new char[s->Size];
s->Read(buf,s->Size);
delete s;
после чего в памяти имеем содержимое файла, правда чтоб этим потом воспользоваться надо рамер гденить запомнить :D
Ммда... проблема, как я понимаю в том, что как только в копируемом файле появляется значок NULL,
после этого места в AnsiString уже ничё не заносится, так как '\0' обозначает конец AnsiString.
Получается, что файл в AnsiString скопировать нельзя, так первый попавшийся в файле NULL обрежет AnsiString. :(
Использовать AnsiString для запихивания в них файла не советую. Лучше использовать для этих целей char указатель.
Пример:
#include <stdio.h>
void main(void)
{
int sz;
char *dump;
FILE *fp=fopen("c:\\test.bin","rb");
fseek(fp,0,SEEK_END);
sz=ftell(fp);
fseek(fp,0,SEEK_SET);
dump=new char[sz];
fread(dump,sz,1,fp);
fclose(fp);
delete dump;
}
дешево и сердито.
Использовать AnsiString для запихивания в них файла не советую. Лучше использовать для этих целей char указатель.
Пример:
#include <stdio.h>
void main(void)
{
int sz;
char *dump;
FILE *fp=fopen("c:\\test.bin","rb");
fseek(fp,0,SEEK_END);
sz=ftell(fp);
fseek(fp,0,SEEK_SET);
dump=new char[sz];
fread(dump,sz,1,fp);
fclose(fp);
delete dump;
}
дешево и сердито.
А что в charе можно будет сохранить файл в несколько мегабайт? Память она резиновая? Сколько можно выделить свободной памяти из программы?
Сколько можно выделить свободной памяти из программы?
Много, иногда непозволительно много, чтобы над этим можно было задумываться.
А обработку небольших файлов, особенно текстовых, иногда очень просто производить в памяти, считывая их целиком в строку.
Кстати, посмотрите код TStrings.LoadFromStream - он считывает файл целиком в память, а потом начинает разбивать его на отдельные строки.
А что в charе можно будет сохранить файл в несколько мегабайт? Память она резиновая? Сколько можно выделить свободной памяти из программы?
сохранить можно и память если и не резиновая, то 4 Гб виртуального адресного пространства - хватит любому процессу :). только в приведенном выше коде не мешало бы после выделения проверять на наличие ошибки выделения.
меня мучает другой вопрос - зачем? сохранять файл в один char* :?
меня мучает другой вопрос - зачем? сохранять файл в один char* :?
я так делал при копировании файлов размером от 3 до 50 метров, при этом копирование происходит на второй космической :-)
меня мучает другой вопрос - зачем? сохранять файл в один char* :?
А может, человек пишет собственный аналог grep или другой подобной программы?
Мне нужно скопировать в переменную AnsiString или char большой файл(2-5 Mb). Возможно ли это?
Кстати о птичках. Можно вообще ничего и никуда не считывать (особенно в случае с большими файлами). Гораздо проще для этих целей воспользоваться следующей последовательностью функций:
CreateFile
CreateFileMapping
MapViewOfFile
(более подробно см. хелп).
FILE *fp=fopen("c:\\test.bin","rb");
fseek(fp,0,SEEK_END);
sz=ftell(fp);
fseek(fp,0,SEEK_SET);
Хех, зачем же так грубо?
sz = filelength(fileno(fp));
:} Хотя кому как нравится......