Чтение целых чисел с fread в ANSI C

77
9

Я пишу программу на C, и я читаю текстовый файл, используя fread и я не могу правильно прочитать целые числа.

Значение a в текстовом файле равно 16, выход, который я получаю:

 a= 538976288

Я использовал аналогичный код, который успешно читал двоичные файлы. Я хотел бы узнать, что лучше всего читать таблицы ASCII в c.

Размер таблицы задается целыми числами в верхней части файла. Данные разделяются пробелами.

Это простой код, который я написал:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
int a, flag_fread;
FILE * p_finput = NULL;
char * filename = NULL;

filename = malloc(sizeof(char) * (strlen(argv[1]) + 1));
strncpy(filename, argv[1],strlen(argv[1]));
filename[strlen(argv[1])] = '\0';

p_finput = fopen(filename, "r");
if (p_finput == NULL)
{
printf("couldn't open %s \n", filename);
abort();
}

flag_fread = fread(&(a), sizeof(int), 1, p_finput);

printf("a= %d \n", a);

fclose(p_finput);
free(filename);
return 0;
}

спросил(а) 2021-01-25T16:29:43+03:00 5 месяцев назад
1
Решение
89

Чтобы прочитать значения, записанные в тексте, вы должны использовать fscanf, например:

fscanf(p_finput, "%d", &a);

ответил(а) 2021-01-25T16:29:43+03:00 5 месяцев назад
77

fread читает данные в файле в своей двоичной форме. Это работает, когда данные были сохранены таким образом, например, с помощью fwrite. При работе с текстом вы можете использовать fscanf, однако рекомендуется использовать его, потому что он не выполняет никаких проверок границ, что может вызвать переполнение буфера.

Лучшей практикой было бы прочитать файл с помощью fgets затем использовать sscanf для получения желаемого значения. Например:

char buffer[100];
int itemsScanned = 0;
if(fgets(buffer, 100, p_finput) != NULL){
itemsScanned = sscanf(buffer, "%d", &a);
}
/* check itemsScanned & continue */

ответил(а) 2021-01-25T16:29:43+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема