在遇到问题时试图读取文本文件的整数。当我有麻烦Ç
问题描述:
从文件中读取一个整数:在遇到问题时试图读取文本文件的整数。当我有麻烦Ç
#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);
}
在“intento1.txt”第一个数字是30771
, 但写在“bubbletry.txt”上的文字是926363699
。 你能告诉我为什么会发生这种情况吗?
答
通常为了读取整数等,您可以使用fscanf
来代替。这比fread
更方便。
fscanf(fp, "%d", &n);
答
因为你读取的前4个字节的intento1.txt, '3', '0', '7' '7',成整数。 '3'是0x33,'0'是0x30,'7'是0x37。因此,您最终在0x33303737中读取,但由于您处于小端架构,所以字节会反转为0x37373033,这是926363699的十六进制表示形式,即您使用fprintf在其中打印到文件的ascii表示形式。
你想要的是从ascii表示中扫描整数,或者通过拉入字符串并转换它或使用fscanf
之类的东西。请记住,数字的二进制表示与ASCII表示不同。
答
除了有关使用fread()
的答案外,您还没有正确地将预期的参数传递给您的函数。虽然fread()
需要指针作为参数(指向变量)读取,但printf()
和fprintf()
都要求打印格式化参数的值(而不是地址!)。因此,在参数传递相同的语法适用于这两种功能:
printf("%d\n", op);
fprintf(f,"%d\n", op);
您也可以找到有用的阅读这些帖子SO:fread,reading text files with fread,fprintf。
谢谢! :D这是非常有帮助的 –
fread是读取二进制数据。 fscanf用于将二进制数据视为所需的格式 –