C fwrite破坏了我的文本文件

C fwrite破坏了我的文本文件,c,fwrite,fread,C,Fwrite,Fread,几天来,我一直在为我的一个班级修改一个程序,但我无法得到fwrite的合作。我试着查看了fread和fwrite的在线资源,查看了我教授的例子,并一次又一次地试图解决这个问题,但没有任何效果。无论我做什么,fwrite都会使我的文本编辑器无法检测到任何类型的字符编码,因此我假设fwrite正在向文件写入内存地址或垃圾值,从而使我无法读取它。程序只需将一个文件的内容写入另一个文件 这是我的密码 #include <unistd.h> #include <stdio.h> #

几天来,我一直在为我的一个班级修改一个程序,但我无法得到fwrite的合作。我试着查看了fread和fwrite的在线资源,查看了我教授的例子,并一次又一次地试图解决这个问题,但没有任何效果。无论我做什么,fwrite都会使我的文本编辑器无法检测到任何类型的字符编码,因此我假设fwrite正在向文件写入内存地址或垃圾值,从而使我无法读取它。程序只需将一个文件的内容写入另一个文件

这是我的密码

#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()
。谢谢!这修复了所有问题。谢谢!这修复了所有问题。谢谢!这修复了所有问题。谢谢!这修复了所有问题。