Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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中的fwrite和fread复制文本文件_C_File_File Io_Fwrite_Fread - Fatal编程技术网

无法通过C中的fwrite和fread复制文本文件

无法通过C中的fwrite和fread复制文本文件,c,file,file-io,fwrite,fread,C,File,File Io,Fwrite,Fread,代码如下: #include <stdio.h> #include <stdlib.h> int main() { FILE *f, *fp; char buff[512]; int buff_size; int bytes; fp = fopen("File.txt", "rb"); if (fp == NULL) { printf("Cannot Open Source File!\n");

代码如下:

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

int main() {
    FILE *f, *fp;
    char buff[512];
    int buff_size;
    int bytes;

    fp = fopen("File.txt", "rb");

    if (fp == NULL) {
        printf("Cannot Open Source File!\n");
        exit(1);
    }

    f = fopen("append.txt", "ab+");

    if (f == NULL) {
        printf("Cannot Open Target File!\n");
        fclose(fp);
        exit(1);
    }

    buff_size = sizeof(buff);

    while (bytes = fread(&buff, buff_size, 1, fp) > 0) {
        if (bytes > 0)
            fwrite(&buff, buff_size, 1, f);
        else
            break;

        printf("Appending...\n\n");
    }

    rewind(f);

    while (bytes = fread(&buff, buff_size, 1, f) > 0)
        if (bytes > 0)
            printf("%s", buff);


    fclose(fp);
    fclose(f);
}
#包括
#包括
int main(){
文件*f,*fp;
字符buff[512];
int buff_大小;
整数字节;
fp=fopen(“File.txt”、“rb”);
如果(fp==NULL){
printf(“无法打开源文件!\n”);
出口(1);
}
f=fopen(“append.txt”、“ab+”);
如果(f==NULL){
printf(“无法打开目标文件!\n”);
fclose(fp);
出口(1);
}
buff_size=sizeof(buff);
而(字节=fread(&buff,buff_size,1,fp)>0){
如果(字节>0)
fwrite(&buff,buff_大小,1,f);
其他的
打破
printf(“追加…\n\n”);
}
倒带(f);
而(字节=fread(&buff,buff_size,1,f)>0)
如果(字节>0)
printf(“%s”,浅黄色);
fclose(fp);
fclose(f);
}
所以,它碰巧没有输出任何内容,当我检查文件“append.txt”时,它也不包含任何内容。 请注意,源文件“File.txt”不是空的。 谁能告诉我它有什么毛病吗

编辑:

我通过将
buff\u size
替换为
strlen(buff)
解决了这个问题,如下所示:
bytes=fread(&buff,strlen(buff),1,f)>0
和第二个
fread()
中的相同

有人能解释一下为什么会这样吗

char buff[512];
int buff_size;

// [...]

bytes = fread(&buff, buff_size, 1, fp)
这将尝试读取一个512字节的块。返回值是读取的块数,因此不是字节数。但撇开这一点不谈,如果您的文件短于512字节,则不会读取任何内容

您需要的是读取512乘以1字节,然后您将得到字节计数,因此将位置交换为
buff\u size
1


旁注:

  • 如果在循环条件下正确执行检查,如:

    while ((bytes = fread(buff, 1, buff_size, fp)) > 0 )
    
    如果(字节数>0)的额外检查是多余的

  • 写入时,您只希望写入实际读取的字节数:

    fwrite(buff, 1, bytes, f);
    
  • 对于尺寸,请始终使用
    size\u t
    --
    int
    很可能是错误的:

    size_t buff_size;
    size_t bytes;
    
  • 使用
    printf(“%s”)
    打印
    buff
    是未定义的行为,因为您没有在
    fread()读取的数据后添加
    '\0'
    字节。C字符串必须以
    '\0'
    结尾。当
    fread()
    读取的数据意外不包含
    '\0'
    时,
    printf()
    将读取并使用未初始化的数据,甚至可能读取超出
    buff
    的范围


Felix Palmen列出了代码中的一些问题,您的修复完全错误,因为
buff
甚至没有空终止符

下面是一个更好的版本:

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

int main(void) {
    FILE *f, *fp;
    char buff[512];
    size_t bytes;

    fp = fopen("File.txt", "rb");
    if (fp == NULL) {
        fprintf(stderr, "Cannot open source file!\n");
        exit(1);
    }

    f = fopen("append.txt", "ab+");
    if (f == NULL) {
        fprintf(stderr, "Cannot open target file!\n");
        fclose(fp);
        exit(1);
    }

    while ((bytes = fread(buff, 1, sizeof buff, fp)) != 0) {
        if (fwrite(buff, 1, bytes, 1, f) != bytes) {
            fprintf(stderr, "Error writing to the target file\n");
            break;
        }
        printf("Appending...\n\n");
    }

    rewind(f);

    while ((bytes = fread(buff, 1, sizeof buff, f)) != 0) {
        printf("%.*s", (int)bytes, buff);
    }
    fclose(fp);
    fclose(f);
    return 0;
}
#包括
#包括
内部主(空){
文件*f,*fp;
字符buff[512];
字节大小;
fp=fopen(“File.txt”、“rb”);
如果(fp==NULL){
fprintf(stderr,“无法打开源文件!\n”);
出口(1);
}
f=fopen(“append.txt”、“ab+”);
如果(f==NULL){
fprintf(stderr,“无法打开目标文件!\n”);
fclose(fp);
出口(1);
}
而((字节=fread(buff,1,sizeof buff,fp))!=0){
if(fwrite(buff,1,bytes,1,f)!=字节){
fprintf(stderr,“写入目标文件时出错\n”);
打破
}
printf(“追加…\n\n”);
}
倒带(f);
而((字节=fread(buff,1,sizeof buff,f))!=0){
printf(“%s”,(int)字节,buff);
}
fclose(fp);
fclose(f);
返回0;
}
请看下面的图片。运算符
位于
=
上方,因此
fread
的返回值将比较为零,然后比较结果将存储在
字节中。你打算写这个

(bytes = fread(&buff, buff_size, 1, fp)) > 0

在给定固定文件名的情况下,这是我对您的问题的解决方案。如果它是我自己的代码,它会将文件名作为参数

#include <stdio.h>

int main(void)
{
    const char src_file[] = "File.txt";
    FILE *fp = fopen(src_file, "rb");

    if (fp == NULL)
    {
        fprintf(stderr, "Cannot Open Source File '%s'!\n", src_file);
        return(1);
    }

    const char tgt_file[] = "append.txt";
    FILE *f = fopen(tgt_file, "ab+");

    if (f == NULL)
    {
        fprintf(stderr, "Cannot Open Target File '%s'!\n", tgt_file);
        fclose(fp);
        return(1);
    }

    char buff[512];
    int bytes;
    while ((bytes = fread(buff, sizeof(char), sizeof(buff), fp)) > 0)
    {
        fwrite(buff, sizeof(char), bytes, f);
        printf("Appending...\n\n");
    }

    rewind(f);

    while ((bytes = fread(buff, sizeof(char), sizeof(buff), f)) > 0)
        printf("%.*s", bytes, buff);

    fclose(fp);
    fclose(f);
    return 0;
}
#包括
内部主(空)
{
const char src_file[]=“file.txt”;
文件*fp=fopen(src_文件,“rb”);
如果(fp==NULL)
{
fprintf(stderr,“无法打开源文件'%s'!\n”,src_文件);
申报表(1);
}
const char tgt_文件[]=“append.txt”;
FILE*f=fopen(tgt_文件,“ab+”);
如果(f==NULL)
{
fprintf(stderr,“无法打开目标文件“%s”!\n”,tgt\u文件);
fclose(fp);
申报表(1);
}
字符buff[512];
整数字节;
而((字节=fread(buff,sizeof(char),sizeof(buff,fp))>0)
{
fwrite(buff,sizeof(char),bytes,f);
printf(“追加…\n\n”);
}
倒带(f);
而((字节=fread(buff,sizeof(char),sizeof(buff),f))>0)
printf(“%s”,字节,buff);
fclose(fp);
fclose(f);
返回0;
}
有各种各样的修复方法,大多数都是在评论中表达出来的

  • 我将文件名设置为数组,这样就可以在
    fopen()
    和错误消息中使用该名称,这些错误消息打印到
    stderr
    ,而不是
    stdout
    。这对通用代码中的其他用户很有帮助。如果文件名来自命令行参数,那么它就无关紧要了

  • fread()
    的调用是固定的,因此报告的是字节数,而不是512字节块数(将为0或1)。这涉及将size/count参数的顺序反转为
    fread()
    。传递的是缓冲区,而不是缓冲区的地址

  • 已正确捕获读取的字节数

  • 读取的字节数用于控制
    fwrite()
    的大小

  • 读取的字节数用于控制
    printf()
    打印的字节数

  • 我不喜欢C99及更高版本中的特殊规则,它允许
    main()
    -但默认情况下只有
    main()
    -返回0。AFAIAC,这是f
    #include <stdio.h>
    
    int main(void)
    {
        const char src_file[] = "File.txt";
        FILE *fp = fopen(src_file, "rb");
    
        if (fp == NULL)
        {
            fprintf(stderr, "Cannot Open Source File '%s'!\n", src_file);
            return(1);
        }
    
        const char tgt_file[] = "append.txt";
        FILE *f = fopen(tgt_file, "ab+");
    
        if (f == NULL)
        {
            fprintf(stderr, "Cannot Open Target File '%s'!\n", tgt_file);
            fclose(fp);
            return(1);
        }
    
        char buff[512];
        int bytes;
        while ((bytes = fread(buff, sizeof(char), sizeof(buff), fp)) > 0)
        {
            fwrite(buff, sizeof(char), bytes, f);
            printf("Appending...\n\n");
        }
    
        rewind(f);
    
        while ((bytes = fread(buff, sizeof(char), sizeof(buff), f)) > 0)
            printf("%.*s", bytes, buff);
    
        fclose(fp);
        fclose(f);
        return 0;
    }