gpt4 book ai didi

c - 如何在程序中正确使用 fread() 和 fwrite()?

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

/*Write a program that indefinitely takes in files to append to a master
file. If the file names are the same, don't do it. If there's an error,
don't do it. Exit with a blank line. Use a custom buffer.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 25
#define BUFSIZE 1024
int append(FILE *, FILE *);

int main(){
char src[MAX_NAME], mainfile[MAX_NAME];
FILE *src_ptr, *mainfile_ptr;
int successes = 0;

puts("Enter name of main file");
if(gets(mainfile) == NULL){
fprintf(stderr, "Error, couldn't get filename\n");
return 1;
}
if((mainfile_ptr = fopen(mainfile, "ab")) == NULL){
fprintf(stderr, "Error, couldn't open mainfile\n");
return 1;
}

do{
puts("Enter a filename to be appended");
if(gets(src) == NULL || src[0] == '\0' || strcmp(src, mainfile) == 0){
if(src[0])
puts("Error, couldn't get filename!");
continue;
}

if((src_ptr =fopen(src, "rb")) == NULL){
puts("Error, could not open file");
continue;
}

if(setvbuf(src_ptr, NULL, _IOFBF, BUFSIZE) != 0){
puts("Couldn't create filebuffer!");
continue;
}

if(append(src_ptr, mainfile_ptr) != 0){
fflush(src_ptr);
puts("Couldn't append!");
continue;
}

fclose(src_ptr);
++successes;
printf("Successfully appended %s, %d files total\n", src, successes);

}while(src[0] != '\0');

fclose(mainfile_ptr);
printf("Successfully appended %d files, bye!\n", successes);
return 0;
}


int append(FILE *src, FILE *mainfile){
size_t bytes = 0;
static char buffer[BUFSIZE];
while(bytes = (fread(buffer, sizeof(char), BUFSIZE, src)) > 0)
fwrite(buffer, sizeof(char), BUFSIZE, mainfile);

if(ferror(src) || ferror(mainfile))
return 1;

return 0;
}

你好。根据 C Primer Plus 示例,我编写了一个程序来附加以下内容用户指定的文件到主文件。最初我写它只是为了使用它文本文件,但后来我将其更改为以二进制模式工作。我用它来附加四个文件。我得到了一些非常奇怪的结果,我不知道为什么。下面是完成后的截图文件(我不得不截取它,因为它充满了非常奇怪的字符)。我也一样没有使用 fopen 以二进制模式打开它们的结果。它似乎“附加”了我的文件多次,其中一些只是一半,然后是另一半。

我哪里错了?

File being viewed in gvim

我不知道为什么它调整了这么多。

最佳答案

while(bytes = (fread(buffer, sizeof(char), BUFSIZE, src)) > 0)
fwrite(buffer, sizeof(char), BUFSIZE, mainfile);

应该是

while((bytes = fread(buffer, sizeof(char), BUFSIZE, src)) > 0)
fwrite(buffer, sizeof(char), bytes, mainfile);

fread 返回小于 BUFSIZE 字节的情况下,您正在将之前读取的数据写入 mainfile

您还可以检查 fwrite 是否返回 bytes,选择是否中止或在写入较少时重试写入缓冲区的剩余部分。

关于c - 如何在程序中正确使用 fread() 和 fwrite()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952816/

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