在c中的文件中写入最大为n的整数,putw()函数错误

Writing even integers up to n in a file in c, putw() function error

我正在编写一个程序,它将在文本文件中输出最大为 100 的所有偶数。

这是完整的代码:

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

#define MAX 100

int main() {
    FILE *fp;
    int i;

    if ((fp = fopen("even_up_to_100.txt", "w")) == NULL) {
        perror("Write");
        exit(1);
    }
    for (i = 1; i <= MAX; ++i) {
        if (!(i % 2))
            putw(i, fp);
    }
    fclose(fp);
    if ((fp = fopen("even_up_to_100.txt", "r")) == NULL) {
        perror("Read");
        exit(2);
    }
    while (!feof(fp))
        printf("%d ", getw(fp));
    fclose(fp);
    return 0;
}

输出(来自文本文件):


                                     "   $   &   (   *   ,   .   0   2   4   6   8   :   <   >   @   B   D   F   H   J   L   N   P   R   T   V   X   Z   \   ^   `   b   d   

输出(来自控制台 window):

2 4 6 8 10 12 14 16 18 20 22 24 -1

请指出代码中的错误(如果有的话)和解决方案。 文本文件中有一些控制字符,这里显示为空格。

由于 getw/putw 是二进制 I/O 函数,您应该以二进制模式打开文件("wb" 而不是 "w" fopen 的模式参数,同样 "rb" 而不是 "r").

字符 26 是 ASCII Ctrl-Z,Windows(和它之前的 DOS)用作文本文件的文件结束标记。因此,如果您在这样的系统上,当您尝试从文件中读取数字 26 时,库会看到一个 Ctrl-Z 字节并将其视为文件的结尾。这可以解释为什么你的程序在 24 之后停止读取。以二进制模式打开会禁用此行为,并且还会避免各种其他问题,例如CR 字符的处理。

请注意,如您所说,如果您的目标是 "output all even integers up to 100 in a text file",那么 getw/putw 是错误的工作工具,因为它们是二进制 I/O,不是文字。 (即使你确实想要二进制格式,你也不应该使用 getw/putw 而应该使用 fread/fwrite,正如我解释的 here。)如果你想要创建一个具有人类可读内容的文本文件,您应该使用 fprintffscanf.