我试图用c写一个程序,将一个文件的内容复制到另一个文件多次,但有些东西是关闭的。出现一些奇怪的字符,并且只复制一次。
c代码#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
char* laod_with_correct_size(char* file_location, int size) {
char* buffer=NULL;
FILE* file;
size=0;
int len;
file=fopen(file_location,"rb");
if(file==NULL) {
fclose(file);
return NULL;
}
fseek(file,0,SEEK_END);
len=ftell(file);
if(len<1) {
fclose(file);
return NULL;
}
rewind(file);
buffer=(char*) malloc(len);
if(buffer==NULL) {
fclose(file);
return NULL;
}
if(fread(buffer,1,len,file)!=(size_t)len) {
free(buffer);
fclose(file);
return NULL;
}
fclose(file);
size=len;
printf("Size in fucntion is %dn",len);
return buffer;
}
int get_size(char* filepath) {
FILE* f;
int len;
f=fopen(filepath,"rb");
fseek(f,0,SEEK_END);
len=ftell(f);
fclose(f);
printf("TOTAL SIZE THAT SHOULD BE IN THE FUCNTION IS %d",len);
}
int write_correctly(char* file,char* buffer,int len) {
// printf("len size is %dn",len);
int file_descriptor = open(file,O_APPEND || O_CREAT);
int len_to_use=get_size(file);
int size=write(file_descriptor,buffer,len_to_use);
printf("Second size in fucntion is %dn",size);
close(file_descriptor);
printf("SIZE OF SIZE+1 IS %d and SIZE OF LEN IS %dn",size+1,len);
if(size!=len) {
return-1;
} else {
return size;
}
}
int main(int argc,char** argv) {
int size=0;
size=get_size(argv[1]);
char* buffer=laod_with_correct_size(argv[1],size);
printf("Size of %s is %dn",argv[1],size);
// if(write_correctly(argv[2],buffer,size)<0) {
// printf("Couldn't writen");
// }
write_correctly(argv[2],buffer,size);
write_correctly(argv[2],buffer,size);
write_correctly(argv[2],buffer,size);
write_correctly(argv[2],buffer,size);
return 0;
}
要复制的第一个文件
salut
buna
alo
第二个文件(复制到)
salut
buna
alo
0 0 0 0 0 0 0 0 0QF7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我的指针生锈了,但我希望我没有犯任何大错误。
函数get_size
声明返回int
类型的值,但从不返回值。
通过在函数main
和write_correctly
中使用这些不存在的返回值,您的程序调用了未定义的行为。
同样,在函数write_correctly
中,您试图写入的数据量等于已经存在的输出文件的大小,这是没有意义的。相反,你应该写缓冲区的大小,而应该是输入文件的大小。
如果在调试器中逐行运行程序,同时监视所有变量的值,您可能会发现更容易理解程序中发生的事情。