2012-04-06 6 views
1

Я попытался использовать функцию write() для записи большой части памяти в файл (более 2 ГБ), но никогда не получится. Может ли кто-нибудь быть хорошим и сказать мне, что делать?Как написать/создать файл размером более 2 ГБ с помощью C/C++

+4

В какой файловой системе и в какой операционной системе мы говорим? –

+2

[Что вы пробовали] (http://mattgemmell.com/2008/12/08/what-have-you-tried/)? – jpm

+0

Как вы писали? Фрагмент кода будет приятным. – ArjunShankar

ответ

2

Это зависит от операционной системы, процессора, файловой системы. В системах Linux/x86-64 (с файловыми системами ext3) это тривиально. Просто используйте обычные библиотечные функции (в C++ std::ofstream, в C <stdio.h>, fopen & & fprintf и т. Д.) Или базовые системные вызовы (открыть, записать).

3

Предполагая, что Linux :)

http://www.suse.de/~aj/linux_lfs.html

1/определяют _FILE_OFFSET_BITS до 64 2/определить _LARGEFILE_SOURCE и _LARGEFILE_SOURCE64 4/Используйте флаг O_LARGEFILE с открытым для работы на большой файл

Кроме того, некоторые информация имеется: http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931

В эти дни файловые системы, которые у вас есть на вашей системе будет поддерживать большой файл из коробки.

+0

Требуется только шаг 1 или полезно. 2-4 являются фиктивными/устаревшими/вредными для переносимости. –

+0

Эй, я попробовал это. На самом деле, используя fopen64, я могу создать файл с максимальным размером 4 ГБ. Но мне нужно больше. В любом случае, для вас совет. – tzcoolman

2

Добавить -D_FILE_OFFSET_BITS=64 в командную строку вашего компилятора (aka CFLAGS), и он будет работать. Это не обязательно для любой 64-разрядной системы, и это также не нужно для некоторых (но не всех) 32-битных систем в наши дни.

Избегайте советов идти писать O_LARGEFILE или open64 и т. Д. На всем протяжении вашего источника. Это не переносится и, довольно просто, уродливо.

Редактировать: На самом деле, я думаю, что мы все неправильно поняли вашу проблему. Если вы используете 32-разрядную систему, то наибольший возможный одиночный объект в памяти составляет 2 ГБ-1 байт (то есть SSIZE_MAX). В POSIX поведение write для аргументов размера, которое не может быть помещено в ssize_t, не определено; это потому, что write возвращает тип ssize_t и не может представлять количество байтов, записанных, если оно больше. Возможно, что более важно, для реализации очень опасно, чтобы объекты настолько велики, что их размер не соответствует ptrdiff_t, поскольку это создало бы ситуацию, когда арифметика указателя могла бы вызывать переполнение целого числа и, таким образом, неопределенное поведение. Возможно, вы смогли создать такой большой объект с mmap (я бы назвал это ошибкой в ​​ядре вашей системы или libc), но это очень плохая идея и приведет ко всем ошибкам. Если вам нужны отдельные объекты размером более 2 ГБ, вам действительно нужно запустить на 64-битной машине, чтобы она была безопасной и без ошибок.

Смежные вопросы