#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc , char **argv)
{
FILE *fp1 = fopen(argv[0] , "r");
FILE *fp2;
fseek(fp1 , 0L , SEEK_END);
long int file_size = ftell(fp1);
printf("file size is : %ldn", file_size);
rewind(fp1);
int cnt = 0;
fp2 = fopen("newImage.jpg", "w");
printf("file pointer is at %ld ", ftell(fp1));
while(cnt < file_size) {
fputc( fgetc(fp1), fp2 );
cnt++;
}
fclose(fp1);
fclose(fp2);
return EXIT_SUCCESS;
}
正如您从评论中发现的那样, argv[0]
在技术上是燃烧的。我想提供一些建议,可以为您节省发布的麻烦。
对于发布到公共论坛的任何内容,建议将代码格式化为"正确",以帮助任何会花时间回答您的人。他们越理解您在做什么,并且您对问题的关心越多,就会得到更好的答案。
对于这样的简单程序,概述输入很有用。打印文件大小时,也打印名称。您会立即看到您复制错误的文件。
对于任何程序,尤其是在C中,尤其是在涉及I/O的情况下,是 Essential 检查SYSCALLS的返回代码。 sustert (3)和 err (3)是您的朋友。值得注意的是,如果您不从 fgetc 中检查EOF,则应将输出文件的每个字节写入-1,并向用户发送消息。(是的,您有权期望,如果您可以打开并在文件上寻找,您就可以从中读取。OTOH,一个很小的错误,例如从fp2
阅读可能会被忽略。)
奇怪的是,仔细检查的谨慎错误会鼓励编写最小的代码。就您而言,您真的不在乎文件有多大。您只想阅读所有输入,直到EOF。如果这样做,您自然会采用习语while( (ch = fgetc(fp1)) != EOF )
,并为自己保存一个电话,以了解文件的大小。
了解 getopt (3)并使用它。那会让您绊倒在argv[0]
上。
如果您遵循该建议,您可能会发现问题本身本身要回答。C是一种简单的语言,C标准库有充分的记录。如果您要注意输入,格式化挑剔,并且在检查错误时不懈地检查,那么剩下的唯一错误将是您的逻辑。这就是您想要的。:-)