C fwrite破坏了我的文本文件
几天来,我一直在为我的一个班级修改一个程序,但我无法得到fwrite的合作。我试着查看了fread和fwrite的在线资源,查看了我教授的例子,并一次又一次地试图解决这个问题,但没有任何效果。无论我做什么,fwrite都会使我的文本编辑器无法检测到任何类型的字符编码,因此我假设fwrite正在向文件写入内存地址或垃圾值,从而使我无法读取它。程序只需将一个文件的内容写入另一个文件 这是我的密码C fwrite破坏了我的文本文件,c,fwrite,fread,C,Fwrite,Fread,几天来,我一直在为我的一个班级修改一个程序,但我无法得到fwrite的合作。我试着查看了fread和fwrite的在线资源,查看了我教授的例子,并一次又一次地试图解决这个问题,但没有任何效果。无论我做什么,fwrite都会使我的文本编辑器无法检测到任何类型的字符编码,因此我假设fwrite正在向文件写入内存地址或垃圾值,从而使我无法读取它。程序只需将一个文件的内容写入另一个文件 这是我的密码 #include <unistd.h> #include <stdio.h> #
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
//initialize files
FILE* infile, *outfile;
char* buffer;
int read = 0;
//handle the case of having the wrong number of inputs.
if (argc != 4){
printf("Error: incorrect number of inputs\n");
//returning 1 will tell us that this was an error (as opposed to returning zero)
return 1;
}
else{
//handle the case of not having read acces to file 1
if ( access(argv[1], R_OK) == 1){
printf("Error: you do not have read access to the first file\n");
return 1;
}
else {
//handle the case of not having write access to file 2
if ( access(argv[2], W_OK) == 1){
printf("Error: you do not have write access to the second file\n");
return 1;
}
else{
//handle a bad buffer size (zero or negative number)
if ((int)*argv[3] < 0){
printf("Error: bad input for buffer size.\nBuffer size: %d \n", (int)*argv[3]);
return 1;
}
}
}
//open the files in the correct mode.
infile = fopen(argv[1], "r");
outfile = fopen(argv[2], "w");
buffer = malloc((int)*argv[3]);
while (!feof(infile)){
read = fread (buffer,1,(int)*argv[3],infile);
fwrite(buffer,1,(int)*argv[3],outfile);
}
}
//close files, and deallocate the buffer.
fclose(infile);
fclose(outfile);
free(buffer);
//if we made it here, then that means that our program ran correctly, so return zero.
return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
//初始化文件
文件*infile,*outfile;
字符*缓冲区;
int read=0;
//处理输入数量错误的情况。
如果(argc!=4){
printf(“错误:输入数量不正确\n”);
//返回1将告诉我们这是一个错误(与返回零相反)
返回1;
}
否则{
//处理对文件1没有读取权限的情况
if(访问(argv[1],R_OK)==1){
printf(“错误:您没有对第一个文件的读取权限\n”);
返回1;
}
否则{
//处理无法对文件2进行写访问的情况
if(访问(argv[2],W_OK)==1){
printf(“错误:您没有对第二个文件的写入权限\n”);
返回1;
}
否则{
//处理错误的缓冲区大小(零或负数)
如果((int)*argv[3]<0){
printf(“错误:缓冲区大小输入错误。\n缓冲区大小:%d\n”,(int)*argv[3]);
返回1;
}
}
}
//以正确的模式打开文件。
infle=fopen(argv[1],“r”);
outfile=fopen(argv[2],“w”);
缓冲区=malloc((int)*argv[3]);
而(!feof(infle)){
read=fread(缓冲区,1,(int)*argv[3],infle);
fwrite(缓冲区,1,(int)*argv[3],输出文件);
}
}
//关闭文件,然后释放缓冲区。
fclose(infle);
fclose(输出文件);
自由(缓冲);
//如果我们在这里成功了,那么这意味着我们的程序运行正确,所以返回零。
返回0;
}
这是错误的
(int)*argv[3]
换成
atoi(argv[3])
如果你把值存储在某个地方,并检查它是否可以转换为整数,比如
int size;
char *endptr;
size = strtol(argv[3], &endptr, 10);
if (*endptr != '\0')
errorNotAnIntegerAbortHere();
buffer = malloc(size);
.
.
.
不是说,*argv[3]
等同于argv[3][0]
,它只是argv[3]
中的第一个字符,这是错误的
(int)*argv[3]
换成
atoi(argv[3])
如果你把值存储在某个地方,并检查它是否可以转换为整数,比如
int size;
char *endptr;
size = strtol(argv[3], &endptr, 10);
if (*endptr != '\0')
errorNotAnIntegerAbortHere();
buffer = malloc(size);
.
.
.
不是说,*argv[3]
等同于argv[3][0]
,它只是argv[3]
中的第一个字符,这是错误的
(int)*argv[3]
换成
atoi(argv[3])
如果你把值存储在某个地方,并检查它是否可以转换为整数,比如
int size;
char *endptr;
size = strtol(argv[3], &endptr, 10);
if (*endptr != '\0')
errorNotAnIntegerAbortHere();
buffer = malloc(size);
.
.
.
不是说,*argv[3]
等同于argv[3][0]
,它只是argv[3]
中的第一个字符,这是错误的
(int)*argv[3]
换成
atoi(argv[3])
如果你把值存储在某个地方,并检查它是否可以转换为整数,比如
int size;
char *endptr;
size = strtol(argv[3], &endptr, 10);
if (*endptr != '\0')
errorNotAnIntegerAbortHere();
buffer = malloc(size);
.
.
.
并非如此,
*argv[3]
将等同于argv[3][0]
,它只是argv[3]
中的第一个字符。fread在EOF时返回的字节数将小于请求的字节数
改为
if (read)
fwrite(buffer,1,read,outfile);
fread返回的字节数将少于EOF时请求的字节数 改为
if (read)
fwrite(buffer,1,read,outfile);
fread返回的字节数将少于EOF时请求的字节数 改为
if (read)
fwrite(buffer,1,read,outfile);
fread返回的字节数将少于EOF时请求的字节数 改为
if (read)
fwrite(buffer,1,read,outfile);
如果不想通过强制转换将
char
转换为int
,您可能需要查看一个,以了解您从字符'9'
中得到了什么(提示:它不是整数值9
),也不想通过强制转换将char
转换为int
,您可能需要签出一个,以了解您从字符'9'
(提示:它不是整数值9
)中得到了什么。如果不将char
转换为int
,您可能需要签出一个,以了解您从字符'9'
中得到了什么(提示:它不是整数值9
)如果不通过强制转换将char
转换为int
,您可能需要检查一个,以确定从中得到什么,例如,字符'9'
(提示:它不是整数值9
)请参见fread()
这是代码中的一般错误,OP应处理3命令行参数并将其转换为int
,请参阅fwrite
之前的fread()
。请参阅fread()
这是代码中的一般错误,OP应处理3命令行参数并将其转换为int
,请参阅fwrite
之前的fread()
。请参阅fread()
这是代码中的一般错误,OP应处理3命令行参数并将其转换为int
,请参阅fwrite
之前的fread()
。请参阅fread()
这是代码中的一般错误,OP应处理3命令行参数并将其转换为int
,请参阅fwrite
之前的fread()
。谢谢!这修复了所有问题。谢谢!这修复了所有问题。谢谢!这修复了所有问题。谢谢!这修复了所有问题。