поместить данные в буфер на C

#c

#c

Вопрос:

Привет, я считываю данные из файла, помещаю их в буфер. Теперь я прочитал данные из файла и получил их в буфер, но каким-то образом буфер заполнен каким-то мусором. На самом деле, я получаю код из http://www.cplusplus.com/reference/clibrary/cstdio/fread /.Я всегда получаю ошибку чтения результата, и когда я проверяю размер LSize и result, они не совпадают.Я новичок в 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 errorn");
        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);
  

Комментарии:

1. Вы напечатали LSize? Вы напечатали результат? Рассматривали ли вы возможность удаления неиспользуемых переменных из этого фрагмента? Рассматривали ли вы возможность определения используемых переменных (результат, буфер), которые не определены? Вы пробовали превратить фрагмент в исполняемую программу?

2. Спасибо, Джонатан, теперь все в порядке после того, как я поставил rb вместо r .

Ответ №1:

 data_fp = fopen("./aaa", "rb");
  

Комментарии:

1. Да, теперь все в порядке!! Но когда я пытаюсь с файлом .txt, я все равно должен помещать rb ??? Когда я попытался использовать r с файлом .txt, результат и размер по-прежнему не совпадают.

2. @kevin: Это потому, что ftell() не сообщает вам размер файла в текстовом режиме. Чтение из двоичного потока, а затем запись в поток текстового режима (например stdout ) обычно не является правильным решением.

Ответ №2:

Ваш файл открыт в текстовом режиме. Использование 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 = resu<
}
  

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

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

 buffer[lSize] = 0;
  

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

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

( sizeof(char) определено как 1 , поэтому здесь в этом нет необходимости).