我希望我会看到结果65,因为65是A的ASCII值。
为什么我改为-1?
#include <stdio.h>
int main()
{
FILE *fp;
fp=fopen("first.txt","w");
putc('A',fp);
fclose(fp);
fp=fopen("first.txt","r");
int x=getw(fp);
printf("%d\n",x);
return 0;
}
答案 0 :(得分:16)
您正在向文件写入一个字节,但是然后尝试从文件中读取sizeof(int)
个字节。因此,getw()
返回EOF
,并且EOF
的值为-1。
因此,在使用getw()
时,应使用ferror()
检查文件句柄,以便能够判断返回的值getw()
是从文件读取的值还是错误的值代码。
或更妙的是,使用fread()
从文件中读取。 getw()
是一个旧函数,用于与旧代码兼容。或者使用getc()
或fgetc()
代替,它们总是将unsigned char
强制转换为int
,因此EOF
可以轻松区分:
int x = getc(fp);
if (x == EOF) {
fputs("Error reading from file.\n", stderr);
} else {
printf("%d\n",x);
}
答案 1 :(得分:6)
哦,我看到您在使用“ w”出现问题时,只需将“ w”更改为“ c”并微笑即可。实际上,您在正确的轨道上。只需将getw()更改为getc()。
输出为-1,因为您正在使用getw()函数读取包含char的.txt文件,而getw()函数从文件读取整数。因此,正确使用的函数是getc()函数,因为.txt文件中有一个char。 getc()函数从文件读取字符。
更快地复制和粘贴:
#include <stdio.h>
int main()
{
FILE *fp;
fp=fopen("first.txt","w");
putc('A',fp);
fclose(fp);
fp=fopen("first.txt","r");
int x=getc(fp);
printf("%d\n",x);
return 0;
}
这将输出65。
答案 2 :(得分:2)
您之所以得到-1
,是因为getw()
从流中读取了下一个单词(单词的大小是int
的大小,并且可能因机器而异),但是您遇到的情况是,当它尝试从文件中读取单词时,遇到EOF
并设置了流的文件结束指示符,并且getw()
返回了EOF
。请注意,EOF
是一个宏,它可以扩展为类型为int
和实现相关的负值的整数常量表达式,但通常为-1
。
如果要使用putw()
来读取文件,则应使用getw()
来写文件。
要向您显示使用putc()
和putw()
写入文件时文件的区别:
使用putc()
时:
putc('A',fp);
检查文件大小:
# ls -lh first.txt
-rw-r--r-- 1 <owner> <group> 1B May 11 18:02 first.txt
^
|
size: 1 byte
使用putw()
时:
putw('A', fp); // the first parameter type of putw() is int and the character will implicitly promoted to int
检查文件大小:
# ls -lh first.txt
-rw-r--r-- 1 <owner> <group> 4B May 11 18:00 first.txt
^
|
size: 4 bytes
如果使用putw()
:
#include <stdio.h>
int main(void) {
FILE *fp;
fp = fopen("first.txt", "w");
if (fp == NULL) {
fprintf (stderr, "Failed to open file for write");
return -1;
}
putw('A', fp); // add the error handling for putw()
fclose(fp);
fp = fopen("first.txt", "r");
if (fp == NULL) {
fprintf (stderr, "Failed to open file for read");
return -1;
}
int x = getw(fp);
if (feof(fp)) {
printf ("End of file reached\n");
}
else if (ferror(fp)) {
printf ("Error occurred\n");
}
else {
printf ("%d\n", x);
}
return 0;
}
输出:
# ./a.out
65