Проблемы с чтением целого числа из файла в C
У меня возникают проблемы при попытке прочитать целое число из текстового файла:
#include <stdio.h>
#include <string.h>
int main()
{
int op;
/* Open file for both reading and writing */
FILE *d = fopen("intento1.txt", "r");
FILE *f = fopen("bubbletry.txt", "w+");
/* Read and display data */
fread(&op, 4, 1, d);
printf("%d\n", &op);
fclose(d);
/* Write data to the file */
fprintf(f,"%d\n",&op);
fclose(f);
return(0);
}
Первый номер в "inteto1.txt" 30771
, но текст, написанный на "bubbletry.txt" 926363699
, Не могли бы вы сказать мне, почему это происходит?
3 ответа
Потому что вы прочитали первые 4 байта inteto1.txt, "3", "0", "7", "7", в целое число. "3" - это 0x33, "0" - это 0x30, "7" - это 0x37. Таким образом, вы в конечном итоге читаете в 0x33303737, но поскольку вы используете архитектуру с прямым порядком байтов, байты обращаются к 0x37373033, который является шестнадцатеричным представлением 926363699, представление ascii, которое вы печатаете в файл с fprintf там.
Вам нужно отсканировать целое число из представления ascii, либо потянув строку и преобразовав ее, либо используя что-то вроде fscanf
, Помните, что двоичное представление числа не совпадает с его представлением ASCII.
Обычно, чтобы прочитать целое число или тому подобное, вы можете использовать fscanf
вместо. Это намного удобнее, чем fread
,
fscanf( fp, "%d", &n );
Для примера, проверьте http://www.cplusplus.com/reference/cstdio/fscanf/
В дополнение к ответу относительно использования fread()
, вы не передали предполагаемые аргументы своим функциям правильно. В то время как fread()
требует указателя в качестве аргумента (указывающего на переменную) для чтения, оба printf()
а также fprintf()
требует, чтобы значение (не адрес!) отформатированного аргумента было напечатано. Таким образом, один и тот же синтаксис при передаче аргументов работает для обеих функций:
printf("%d\n", op);
fprintf(f,"%d\n", op);
Вам также может пригодиться чтение этих SO сообщений: fread, чтение текстовых файлов с помощью fread, fprintf.