C++ FILE readInt функция? (из двоичного файла)

Есть ли функция для FILE (fopen?), Которая позволяет мне просто читать один int из двоичного файла?

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

void opentest()
{
    FILE *fp = fopen("dqmapt.mp", "r");
    int i = 0;
    int j = 0;
    int k = 0;
    int * buffer;
    if (fp)
    {
        buffer = (int *) (sizeof(int));

        i = (int) fread(buffer,1, (sizeof(int)), fp);
        fscanf(fp, "%d", &j);
        fclose(fp);
    }

    printf("%d\n", i);
    printf("%d\n", j);
}

Ответов (3)

Решение

Теперь, когда вы изменили свой вопрос, позвольте мне задать один. Какой формат файла вы пытаетесь прочитать?

Для двоичного файла необходимо внести некоторые изменения в способ открытия файла:

/* C way */
FILE *fp = fopen("text.bin", "rb"); /* note the b; this is a compound mode */

/* C++ way */
std::ifstream ifs("test.txt", ios::in | ios::binary);

Читать содержание легко. Но помните, что ваш файл имеет 2 целых числа в начале - ширина, высота, которые определяют, сколько еще нужно читать, т.е. другое число целых чисел ширина * высота. Итак, лучше всего сначала прочитать первые два целых числа. Вам нужно будет использовать два буфера - один для ширины и высоты, а затем, в зависимости от их значения, другой для чтения остальной части файла. Итак, давайте прочитаем первые два целых числа:

char buf[ 2 * sizeof(int) ]; /* will store width and height */

Прочтите два целых числа:

/* C way */
fread(buf, sizeof(int), 2, fp); /* the syntax changes, FILE pointer is last */

/* C++ way*/ 
ifs.read(buf, sizeof buf);

А теперь самое сложное. Вы должны преобразовать материал в два раза. Это опять же зависит от порядка байтов в вашей системе - работает ли простое присваивание или требуется перестановка байтов. Как указал другой плакат, WriteInt() целые числа записываются в формате с прямым порядком байтов. Выясните, в какой системе вы находитесь. И тогда вы можете продолжить.

FILE это структура данных C. Он включен в C++ для совместимости с C. Ты можешь сделать это:

/* The C way */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   FILE *fp = fopen("test.txt", "r");
   int i = 0;
   if (fp) {
      fscanf(fp, "%d", &i);
      fclose(fp);
   }
   printf("%d\n", i);
}

Вы можете использовать эту std::ifstream штуку, чтобы открыть файл для чтения. Вы должны прочитать содержимое, используя другое заклинание, чтобы прочитать содержимое файла и самостоятельно извлечь из него нужную информацию.

/* The C++ way */
#include <fstream>
#include <iostream>

int main() {
   std::ifstream ifs("test.txt");
   int i = 0;
   if (ifs.good()) {
      ifs >> i;
   }
   std::cout << i << std::endl;
}

Обратите внимание, что вы также можете использовать функции стиля C в C++, хотя это наименее рекомендуемый способ:

/* The C way in C++ */
#include <cstdio>
#include <cstdlib>

int main() {
   using namespace std;
   FILE *fp = fopen("test.txt", "r");
   int i = 0;
   if (fp) {
      fscanf(fp, "%d", &i);
      fclose(fp);
   }
   printf("%d\n", i);
}

[ Примечание: в обоих примерах предполагается, что у вас есть текстовый файл для чтения]

Int представлен как текст или двоичный?

Для текста используйте fscanf ; для двоичного кода используйте fread .

Вы хотите прочитать текстовое представление int? Затем вы можете использовать fscanf, это своего рода противоположность printf

int n;
if( fscanf(filePointer, "%d", &n) == 1 )
  // do stuff with n

If you want to read some binary data and treat it as an int, well that's going to depend how it was written in the first place.


I am not a Java programmer, so this is just based on what I've read in the [docs](http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataOutputStream.html#writeInt(int)).

That said, it says

Writes an int to the underlying output stream as four bytes, high byte first. If no exception is thrown, the counter written is incremented by 4.

Итак, это четырехбайтовое целое с прямым порядком байтов. Я не знаю, являются ли это двумя дополнениями или нет, но это, вероятно, безопасное предположение (и, вероятно, его можно найти где-нибудь в java docs / spec). Порядок ntohl байтов с прямым порядком байтов совпадает с порядком байтов в сети, поэтому вы можете использовать его для преобразования порядка байтов вашей платформы C++. Помимо этого, вам просто нужно прочитать четыре байта, что можно сделать с помощью fread .