我正在尝试从文件“file.txt”中读取内容并将每个字符从那里写入“copy.txt”但是我在“copy.txt”文件的末尾会得到一个奇怪的字符。
我正在尝试打开和关闭这两个文件并修改程序中while循环的主体,以便不再将该字符放到标准输出(stdout)。
{{1}}
答案 0 :(得分:3)
你的问题在于这个循环:
do
{
c = getc(from);
putc(c, to);
}
while(c != EOF);
您需要了解的是do-while
和while
循环之间的区别。 while
循环将在运行循环之前评估表达式(因此循环运行至少0次)并且do-while
循环在循环循环之后评估(因此至少运行一次)。
那么问题是什么?您读取了一个字符,将其写入copy.txt
,然后评估它是否为EOF
并退出循环。现在,从文件中读取最后一个字符时会发生什么?循环将再次运行,因为最后一个字符不是EOF
。您的程序将再读一个字符并写入该文件。这就是你的意思。
因此,为了解决问题,您需要在编写之前评估EOF
。以下是两次尝试,其中一次将保留do-while
循环,另一次使用while
循环(更清晰):
Do-While Attempt(不漂亮且不必要的话):
do
{
c = getc(from);
if (c != EOF) {
putc(c, to);
}
}
while(c != EOF);
尝试时:
while ((c = getc(from)) != EOF) {
putc(c, to);
}