在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。)如果你想要创建一个具有人类可读内容的文本文件,您应该使用 fprintf
和 fscanf
.
我正在编写一个程序,它将在文本文件中输出最大为 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。)如果你想要创建一个具有人类可读内容的文本文件,您应该使用 fprintf
和 fscanf
.