gpt4 book ai didi

C写入后附加到文件

转载 作者:太空宇宙 更新时间:2023-11-04 07:12:42 25 4
gpt4 key购买 nike

我正在测试操作文件的基本功能。

我尝试先打开/关闭一个文件来创建它,然后再次打开/关闭它以附加到它。最后,我打印出文件中的内容。

我的代码目前如下所示:

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

int main()
{
FILE * file;
char mark;

/* WRITING: */
file= fopen("goodbye.c","w");
if(!file)
{ printf("Couldn't open file.\n");
exit(EXIT_FAILURE); }
printf("Enter data to write to .c file:");
while((mark= getchar())!=EOF)
{
putc(mark,file);
}
fclose(file);

/* APPENDING: */
file= fopen("goodbye.c","a");
if(!file)
{ printf("Couldn't open file.\n");
exit(EXIT_FAILURE); }
char add;
scanf("%c",add);
putc(add,file);
fclose(file);

/* READING: */
file= fopen("goodbye.c","r");
if(!file)
{ printf("Couldn't open file.\n");
exit(EXIT_FAILURE); }
while((mark= getc(file))!= EOF)
{
printf("%c",mark);
}
fclose(file);
}

有了这个,我无法附加到文件。当使用 getchar() 时,我首先完成写入后键入 ctrl+d。在此之后,它继续打印出我刚刚写的内容,而不是让我有机会附加到文件中。 ctrl+d 是否会以某种方式中断 scanf?以及如何获得我正在寻找的结果?

最佳答案

您的代码只允许您将单个字符附加到文件中,这有点吝啬。如果文本文件的最后一行不以换行符结尾,它也可能(至少在理论上)导致某些系统出现问题,如果您添加换行符以外的内容,则不会。也许您需要一个循环来读取多个字符?

此外,由于直到 EOF 才停止初始输入,因此您需要使用 clearerr(stdin) 清除 stdin 上的“错误”以允许进一步输入发生。这在 Mac OS X 10.10.1 Yosemite 上工作正常;它在其他 Unix 系统上应该也能正常工作。对于基于 Windows 的代码,我无法自信地回答,除非它使用 Cygwin 之类的东西来模拟 Unix,但我希望即使使用 MSVC,它也能以大致相同的方式工作。

顺便说一下,我的编译器在调用 scanf() 时提示缺少 & :

char add;
scanf("%c",add);

如果您的编译器没有报错,请提高警告级别或获得更好的编译器。

这段代码如我所料:

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

int main(void)
{
FILE *file;
char mark;

/* WRITING: */
file = fopen("goodbye.c", "w");
if (!file)
{
printf("Couldn't open file.\n");
exit(EXIT_FAILURE);
}
printf("Enter data to write to .c file:");
while ((mark = getchar()) != EOF)
{
putc(mark, file);
}
fclose(file);
printf("EOF 1\n");

/* APPENDING: */
file = fopen("goodbye.c", "a");
if (!file)
{
printf("Couldn't open file.\n");
exit(EXIT_FAILURE);
}
clearerr(stdin);
char add;
while (scanf("%c", &add) == 1)
putc(add, file);
fclose(file);
printf("EOF 2\n");

/* READING: */
file = fopen("goodbye.c", "r");
if (!file)
{
printf("Couldn't open file.\n");
exit(EXIT_FAILURE);
}
while ((mark = getc(file)) != EOF)
{
printf("%c", mark);
}
fclose(file);
return 0;
}

唯一实质性的变化是在 scanf() 周围添加了一个循环——不过坦率地说,再次使用 getchar() 会更好,就像在第一个输入循环中一样— 修复对 scanf() 的调用,添加两个 printf() 报告检测到 EOF 的语句,并包括 clearerr(stdin); 允许输入继续。

示例输出

没有 clearerr(stdin) 的代码:

Enter data to write to .c file:Happiness is a bug-free program.
Happiness is seldom attained.
EOF 1
EOF 2
Happiness is a bug-free program.
Happiness is seldom attained.

使用 clearerr(stdin) 编写代码:

Enter data to write to .c file:Happiness is a bug-free program.
Happiness is seldom attained.
EOF 1
But it helps when you add the clearerr(stdin) to this one.
EOF 2
Happiness is a bug-free program.
Happiness is seldom attained.
But it helps when you add the clearerr(stdin) to this one.

关于C写入后附加到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27117973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com