C ++ ФАЙЛ функция чтения? (из двоичного файла) - PullRequest
2 голосов
/ 01 марта 2009

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

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

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 ]

7 голосов
/ 01 марта 2009

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

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

/* 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);
}

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

2 голосов
/ 01 марта 2009

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

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

Если вы хотите прочитать некоторые двоичные данные и трактовать их как целое число, то это будет зависеть от того, как они были записаны.


Я не программист на Java, так что это просто основано на том, что я прочитал в [документах] (http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataOutputStream.html#writeInt(int)).

Тем не менее, это говорит

Записывает int в базовый выходной поток в виде четырех байтов, старший байт - первый. Если исключение не выдается, значение счетчика увеличивается на 4.

Так что это четыре байта целого числа с прямым порядком байтов. Я не знаю, если это дополнение к двум или нет, но это, вероятно, безопасное предположение (и, вероятно, можно найти где-то в документации / спецификации Java). Big endian - это то же, что и сетевой порядок байтов, поэтому вы можете использовать ntohl для преобразования его в порядок вашей платформы C ++. Кроме того, вам просто нужно прочитать четыре байта, что можно сделать с помощью fread.

0 голосов
/ 01 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...