尝试读取字符时为什么getw返回-1?

时间:2019-05-11 11:49:14

标签: c

我希望我会看到结果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;
}

3 个答案:

答案 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