Чтение файла в массив char, затем размер malloc. (С) - PullRequest
0 голосов
/ 26 октября 2010

Эй, допустим, я получаю файл в качестве первого аргумента командной строки.

int main(int argc, char** argv) {
    unsigned char* fileArray;

    FILE* file1 = fopen(argv[1], "r");
}

Теперь, как я могу прочитать этот файл, символ за символом, в char* fileArray?

В основном, как я могу преобразовать FILE* в char*, прежде чем я узнаю, насколько большой мне нужен malloc для char*

Я знаю, что возможное решение - использовать буфер, но моя проблема здесь в том, что я имею дело с файлами, которые могут иметь более 900000 символов, и не считаю нужным создание такого большого буфера.

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

Если используются только «реальные» файлы (не потоковые, устройства, ...), вы можете использовать stat / fstat или что-то вроде

int retval=fseek(file1,0,SEEK_END); // succeeded if ==0  (file seekable, etc.)
long size=ftell(file1); // size==-1 would be error
rewind(file1);

, чтобы получить размер файла заранее. Тогда вы можете malloc и читать. Но так как file1 может измениться за это время, вы все равно должны убедиться, что не читаете за пределами вашего неправильного размера.

1 голос
/ 26 октября 2010

Существует несколько подходов:

  • укажите максимальный размер, который вы можете обработать, затем вы просто выделяете его один раз (как глобальный, так и в куче).
  • обрабатывайте файл порциями, если вы беспокоитесь о том, чтобы поместить его в память сразу.
  • обрабатывает произвольный размер, используя malloc с realloc (когда вы читаете биты).

Номер 1 легко:

static char buff[900001];                  // or malloc/free of 900000
count = fread (buff, 1, 900001, fIn);
if (count > 900000)                        // problem!

Номер 2, вероятно, лучший способ сделать это, если вам абсолютно не нужно , требующий всего файла в памяти сразу. Например, если ваша программа считает количество слов, она может последовательно обрабатывать файл по несколько килограмм за раз.

Номер 3, вы можете поддерживать переменные buffer, used и max. Изначально установите max на 50 КБ и выделите buffer в качестве этого размера.

Затем попробуйте прочитать один блок 10K в фиксированный буфер tbuff. Сложите текущее значение used и количество считанных байтов в tbuff и, если оно больше max, выполните realloc, чтобы увеличить buffer еще на 50 КБ (одновременно корректируя max) .

Затем добавьте tbuff к buffer, отрегулируйте used, промойте и повторите. Обратите внимание, что все эти значения (10K, 50K и т. Д.) Являются только примерами. В зависимости от ваших потребностей вы можете использовать разные значения.

...