无法通过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
旁注:
- 如果在循环条件下正确执行检查,如:
如果(字节数>0)的额外检查是多余的while ((bytes = fread(buff, 1, buff_size, fp)) > 0 )
- 写入时,您只希望写入实际读取的字节数:
fwrite(buff, 1, bytes, f);
- 对于尺寸,请始终使用
--size\u t
很可能是错误的:int
size_t buff_size; size_t bytes;
- 使用
打印printf(“%s”)
是未定义的行为,因为您没有在buff
fread()读取的数据后添加
字节。C字符串必须以'\0'
结尾。当'\0'
读取的数据意外不包含fread()
时,'\0'
将读取并使用未初始化的数据,甚至可能读取超出printf()
的范围buff
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;
}