положить данные в буфер в C - PullRequest
0 голосов
/ 13 апреля 2011

Привет Я читаю данные из файла и помещаю его в буфер. Теперь я прочитал данные из файла и получил их в буфере, но каким-то образом буфер заполнен каким-то мусором. На самом деле, я получаю код от http://www.cplusplus.com/reference/clibrary/cstdio/fread/.I всегда получаю результат Ошибка чтения , и когда я проверяю размер lSize и результат, они не совпадают. Я новичок в C или C ++. Кто-нибудь может мне помочь? Я отмечаю C и C ++, так как не знаю, какой из них правильный. К сожалению.

FILE *data_fp, *keyFile;
long lSize;
int i,j;
char hvalue[21];
char dt[300];
uint64_t insert_key;

data_fp = fopen("./aaa", "r+");
if (data_fp == NULL) {
        printf("fopen aaa error\n");
        exit(-1);
}
// obtain file size:
fseek (data_fp , 0 , SEEK_END);
lSize = ftell (data_fp);
rewind (data_fp);

// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

size_t result = fread (buffer,1,lSize,data_fp);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
puts(buffer);

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Ваш файл открыт в текстовом режиме. Использование ftell() для определения длины файла, открытого в текстовом режиме, не переносимо и не обязательно работает.

fread() может вернуть короткий счетчик элементов, если достигнут конец файла или произошла ошибка. Вы должны использовать feof() / ferror(), чтобы определить, в каком случае:

size_t result = fread(buffer, 1, lSize, data_fp);
if (result != lSize) {
    if (ferror(data_fp)) {
        perror("Reading error");
        exit (3);
    }
    /* End-of-file reached, so adjust file size downward */
    lSize = result;
}

(Использование perror() будет означать, что если произошла ошибка , вы увидите, что это такое).

Обратите внимание, что данные, считанные из файла, не обязательно обнуляются, поэтому вы не можете просто передать их в puts(). Вы должны добавить нуль-терминатор:

buffer[lSize] = 0;

Для этого также потребуется выделить один дополнительный байт:

buffer = (char*) malloc (lSize + 1);

(sizeof(char) определяется как 1, поэтому здесь это не нужно).

2 голосов
/ 13 апреля 2011
data_fp = fopen("./aaa", "rb");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...