используя fread для чтения в буфер int - PullRequest
0 голосов
/ 03 октября 2011

Я хотел бы знать, могу ли я использовать fread для чтения данных в целочисленный буфер. Я вижу, fread () принимает void * в качестве первого параметра. Так что я не могу просто передать целое число буфер (typecast to void *), а затем используйте его для чтения того, сколько байт я хочу из файла, если буфер достаточно большой?

т. я не могу сделать:

  int buffer[10];
  fread((void *)buffer, sizeof(int), 10, somefile);
  // print contents of buffer
  for(int i = 0; i < 10; i++)
  cout << buffer[i] << endl;

Что здесь не так?

Спасибо

Ответы [ 5 ]

7 голосов
/ 03 октября 2011

Это должно работать, если вы записали целые числа в файл, используя что-то вроде fwrite («двоичная» запись).Если файл читается человеком (вы можете открыть его в текстовом редакторе и увидеть числа, которые имеют смысл), вам, вероятно, понадобится fscanf / cin.

4 голосов
/ 03 октября 2011

Как уже упоминали другие, fread должен иметь возможность делать то, что вы хотите, при условии, что ввод в двоичном формате, который вы ожидаете.Я бы добавил, что код будет иметь зависимости от платформы и не будет работать правильно, если входной файл перемещается между платформами с целыми числами разного размера или различными порядковыми номерами (sp).

Кроме того, вы должны всегдапроверьте ваши возвращаемые значения;Fread может потерпеть неудачу.

2 голосов
/ 25 марта 2012

Я пробовал то же самое и получал тот же результат, что и у вас, большое значение int при попытке прочитать целое число, используя fread() из файла, и, наконец, получил причину для этого. Предположим, что ваш входной файл содержит только:

  1. "5"
  2. "5 5 5"

Подробности, которые я получил от http://www.programmersheaven.com/mb/beginnercpp/396198/396198/fread-returns-invalid-integer/

fread() читает двоичные данные (даже если файл открывается в текстовом режиме). Число 540352565 в шестнадцатеричном формате - 0x20352035, 0x20 - это код ASCII пространства, а 0x35 - это код ASCII '5' (они в обратном порядке, потому что используются машины с прямым порядком байтов) .

То, что делает fread, читает коды ASCII из файла и строит из него целое число, ожидая двоичные данные. Это должно объяснить поведение при чтении файла '5 5 5'. То же самое происходит при чтении файла с одним '5', но может быть прочитан только один байт (или два, если за ним следует символ новой строки), и fread должен потерпеть неудачу, если он читает меньше sizeof(int) байтов, что 4 (в данном случае).

2 голосов
/ 03 октября 2011

Да, вы можете использовать fread для чтения в массив целых чисел.

int buffer[10]; 

size_t readElements = fread((void *)buffer, sizeof(int), 10, somefile); 

for(int i = 0; i < readElements; i++) 
   cout << buffer[i] << endl

Вы можете проверить количество элементов, возвращаемых fread для вывода.файл в двоичном режиме и значения были записаны как cnicutar, упомянутый с fwrite.

1 голос
/ 14 июля 2017

Поскольку реакция на ответ такова, что он все еще не работает, я приведу здесь полный код, чтобы вы могли попробовать его.

Обратите внимание, что следующий код НЕ содержит надлежащих проверок, и сбой CANесли файл не существует, памяти не осталось, нет прав и т. д. В код необходимо добавить проверку для каждой операции открытия, закрытия, чтения, записи.

Более того, я бы выделил буфер динамически.

int* buffer = new int[10];

Это потому, что я не чувствую себя хорошо, когда в качестве указателя берется обычный массив.Но что угодно.Также обратите внимание, что для экономии места следует использовать правильный тип (uint32_t, 16, 8, int, short ...) в соответствии с диапазоном номеров.

Следующий код создаст файл и запишет туда правильные данныечто вы можете прочитать.

    FILE* somefile;
    somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "wb");

  int buffer[10];
  for(int i = 0; i < 10; i++)
    buffer[i] = 15;

  fwrite((void *)buffer, sizeof(int), 10, somefile);
  // print contents of buffer
  for(int i = 0; i < 10; i++)
  cout << buffer[i] << endl;

  fclose(somefile);

    somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "rb");

  fread((void *)buffer, sizeof(int), 10, somefile);
  // print contents of buffer
  for(int i = 0; i < 10; i++)
  cout << buffer[i] << endl;

  fclose(somefile);
...