Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Скопировать в AnsiString

4.6K
26 апреля 2004 года
JuriS
8 / / 26.11.2003
Мне нужно скопировать в переменную AnsiString или char большой файл(2-5 Mb). Возможно ли это?
2
26 апреля 2004 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by JuriS
Мне нужно скопировать в переменную AnsiString или char большой файл(2-5 Mb). Возможно ли это?



а почему нет? что тебя смущает?

4.6K
26 апреля 2004 года
JuriS
8 / / 26.11.2003
Ну а как это сделать?
2.0K
26 апреля 2004 года
Tristan
27 / / 17.10.2002
Цитата:
Originally posted by JuriS
Ну а как это сделать?



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

4.6K
26 апреля 2004 года
JuriS
8 / / 26.11.2003
Ммда... проблема, как я понимаю в том, что как только в копируемом файле появляется значок NULL,
после этого места в AnsiString уже ничё не заносится, так как '\0' обозначает конец AnsiString.
Получается, что файл в AnsiString скопировать нельзя, так первый попавшийся в файле NULL обрежет AnsiString. :(
469
27 апреля 2004 года
Sli
71 / / 20.01.2000
Цитата:
Originally posted by JuriS
Ммда... проблема, как я понимаю в том, что как только в копируемом файле появляется значок NULL,
после этого места в AnsiString уже ничё не заносится, так как '\0' обозначает конец AnsiString.
Получается, что файл в AnsiString скопировать нельзя, так первый попавшийся в файле NULL обрежет AnsiString. :(



на самом деле в AnsiString все можно затолкать в т.ч. и '\0' прямо в середину, а вот проблемы могут возникнуть при посивольном считывании так как это сделал Tristan. Дело в том что символ EOF есть '\0xff' так что если он встретиться в файле ( а это очень вероятно ) чтение на этом прекратиться.

Могу предложить следущее решение:

 
Код:
TFileStream *s=new TFileStream("имя_файла",fmOpenRead|fmShareDenyNone);
char *buf=new char[s->Size];
s->Read(buf,s->Size);
delete s;

после чего в памяти имеем содержимое файла, правда чтоб этим потом воспользоваться надо рамер гденить запомнить :D
487
28 апреля 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by JuriS
Ммда... проблема, как я понимаю в том, что как только в копируемом файле появляется значок 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;
}

дешево и сердито.

2.1K
28 апреля 2004 года
domovoi
27 / / 27.03.2003
Цитата:
Originally posted by ddnh_bc


Использовать 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е можно будет сохранить файл в несколько мегабайт? Память она резиновая? Сколько можно выделить свободной памяти из программы?

10
29 апреля 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by domovoi
Сколько можно выделить свободной памяти из программы?


Много, иногда непозволительно много, чтобы над этим можно было задумываться.
А обработку небольших файлов, особенно текстовых, иногда очень просто производить в памяти, считывая их целиком в строку.

Кстати, посмотрите код TStrings.LoadFromStream - он считывает файл целиком в память, а потом начинает разбивать его на отдельные строки.

2
29 апреля 2004 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by domovoi


А что в charе можно будет сохранить файл в несколько мегабайт? Память она резиновая? Сколько можно выделить свободной памяти из программы?



сохранить можно и память если и не резиновая, то 4 Гб виртуального адресного пространства - хватит любому процессу :). только в приведенном выше коде не мешало бы после выделения проверять на наличие ошибки выделения.
меня мучает другой вопрос - зачем? сохранять файл в один char* :?

469
29 апреля 2004 года
Sli
71 / / 20.01.2000
Цитата:
Originally posted by squirL

меня мучает другой вопрос - зачем? сохранять файл в один char* :?



я так делал при копировании файлов размером от 3 до 50 метров, при этом копирование происходит на второй космической :-)

10
29 апреля 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by squirL
меня мучает другой вопрос - зачем? сохранять файл в один char* :?


А может, человек пишет собственный аналог grep или другой подобной программы?

487
02 мая 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by JuriS
Мне нужно скопировать в переменную AnsiString или char большой файл(2-5 Mb). Возможно ли это?



Кстати о птичках. Можно вообще ничего и никуда не считывать (особенно в случае с большими файлами). Гораздо проще для этих целей воспользоваться следующей последовательностью функций:
CreateFile
CreateFileMapping
MapViewOfFile

(более подробно см. хелп).

2.0K
02 мая 2004 года
HardMix
78 / / 25.06.2003
Цитата:
Originally posted by ddnh_bc


FILE *fp=fopen("c:\\test.bin","rb");
fseek(fp,0,SEEK_END);
sz=ftell(fp);
fseek(fp,0,SEEK_SET);


Хех, зачем же так грубо?

sz = filelength(fileno(fp));

:} Хотя кому как нравится......

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог