Можно ли работать с файлами огромных размеров ч-з функции stdio, заметил что fopen может открыть только файлы с размером 2^16. Не предлагайте маппирование или функции апи из кернела и нтдлл, меня интересует именно stdio.
samba никаких проблем не вижу: Код (Text): #include <stdio.h> #include <stdlib.h> #include <assert.h> int main(int argc, char ** argv) { FILE * fd; unsigned char * buf; const size_t bufsize = 4*1024*1024*sizeof(unsigned char); // 4 Mb buf = (unsigned char *)malloc(bufsize); assert(buf); fd = fopen("test.bin", "wb"); if (fd) { size_t size; size = 0; memset(buf, 0, bufsize); while (size<=2*1024*1024*1024) { fwrite(buf, 1, bufsize, fd); size += bufsize; } fclose(fd); } fd = fopen("test.bin", "rb"); assert(fd); if (fd) { fread(buf, 1, bufsize, fd); fclose(fd); } free(buf); return EXIT_SUCCESS; } /* [EOF] */
спасибо за пример, но меня больше интересует открытие файлов от 2х Гб и больше ч-з fopen, и считывание из него строк ч-з fgets
samba Только что нормально открыл файл размером в 4GB и прочитал два последних байта(fopen, fseek, fgets). Наверное это от реализации зависит, поддерживает ли fopen работу с большими файлами.
Stiver а что за компилятор у тебя? можно ли открыть и прочесть файл скажем в 10 Гиг ? у меня MS VS 7.0.9466, может ли зависеть от параметров компиляции? выложи плиз что у тебя.
samba У меня VC6 с его стандартными библиотеками, Win XP. Могу по идее попробовать на 25ти гигабайтном файле, но после обеда Код проще некуда: Код (Text): char d[3]; char *res; FILE *fp; fp = fopen("---", "r"); fseek(fp,-1,SEEK_END); res=fgets(d, 2, fp); printf("%d\n", d[0]); printf("%d\n", d[1]); Компилировал как С (не С++). Update: нет, не могу попробовать Он запакован, а распаковать места нет. Кстати WinRar у таких больших файлов неправильно размер показывает.
хм, создал новый проект, тот же код работает, открыл и пропарсил 2 файла, размером в 2,2 и 5,7 Гб, вот код, щас постараюсь понять почему то же не работало в другом проекте. Похоже дело в параметрах компиляции. Код (Text): int _tmain(int argc, _TCHAR* argv[]) { if( FILE* f = fopen("1.txt","rb") ) { while( !feof(f) ) { char buffer[MAX_PATH]; if( fgets(buffer,sizeof(buffer),f) ) { printf(buffer); } } fclose(f); } return 0; }