Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将文件写入缓冲区_C - Fatal编程技术网

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");
}