C 将文件写入缓冲区
我试图把一个文件复制到另一个文件,作为一种学术练习。当我打印输入和输出文件时,它“似乎”工作正常,但是C 将文件写入缓冲区,c,C,我试图把一个文件复制到另一个文件,作为一种学术练习。当我打印输入和输出文件时,它“似乎”工作正常,但是strlen和使用strcmp进行的比较表明它们不完全相同。以下是我所拥有的: $ cat in.txt Hello There It's me, ok? 你好 有 是我,好吗 你好 有 是我,好吗 同样的?没有 在复制内容或比较内容时,我似乎做错了什么 嗯……看起来整件事都解决了,但是在fclose之前放了一个fflush(out)。fclose是否不会自动刷新缓冲区?操作员正在使用短路逻
strlen
和使用strcmp
进行的比较表明它们不完全相同。以下是我所拥有的:
$ cat in.txt
Hello
There
It's me, ok?
你好有
是我,好吗
你好
有
是我,好吗
同样的?没有 在复制内容或比较内容时,我似乎做错了什么
嗯……看起来整件事都解决了,但是在
fclose
之前放了一个fflush(out)
。fclose
是否不会自动刷新缓冲区?操作员正在使用短路逻辑。因此,如果fclose(in)的返回值为0,表示成功,那么fclose(out)将不执行。不要使用&&因为fclose(in)和&fclose(out)而没有关闭文件代码>。成功后,fclose(in)
返回0,使和&
短路,不运行fclose(out)代码>。要修复将&&
替换为+
,-
,*
或,
。你也可以考虑使用<代码>;<改为code>。检查调试器中in\u contents
和out\u contents
缓冲区的内容。查看每个字符并验证它们是否确实相同。代码正在使用buffer[cur]='\0'在数组外部写入空字符
@chux似乎是一样的,只是在我进行比较时缓冲区没有刷新(见问题末尾)。此外,该示例非常精心设计,因此它永远不会在数组外写入-文本仅为~40个字符。问题在于如何巧妙地fclose(in)和&fclose(out)代码>@AnttiHaapala有什么问题吗?谢谢,这就是我要找的。顺便问一下,执行fclose(out)
是否会自动刷新该输出文件?@samuelbrody1249是。这是肯定的。。。除非fclose
失败。但是如果它失败了,那么你无论如何也不能做任何事情。谢谢,无论如何,我认为只要把它放在单独的行中,无论如何都会让它更可读(至少对我来说)。@samuelbrody1249当然可以。请保证您不再像那样使用&&
:DDo也不要在这里使用|
。把两个close()
放在两行上并不难。
void cat(const char* filepath, char buffer[], size_t len)
{
FILE *f = fopen(filepath, "rb");
if (!f) exit(EXIT_FAILURE);
size_t cur = 0;
for (int ch; (ch=getc(f)) != EOF && cur < len; cur++) {
buffer[cur] = ch;
}
buffer[cur] = '\0';
fclose(f);
}
int main(void)
{
FILE *in = fopen("in.txt", "r");
FILE *out = fopen("out.txt", "w");
char buffer[40];
while (fgets(buffer, 40, in)) {
fputs(buffer, out);
}
fclose(in) && fclose(out);
char in_contents[200], out_contents[200];
cat("in.txt", in_contents, 200);
cat("out.txt", out_contents, 200);
printf("%s%sSame? %s\n", in_contents, out_contents, strcmp(in_contents, out_contents)==0?"Yes":"No");
}