为什么我不能使用文本编辑器或使用C程序创建图像文件(JPG)复制


#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标准库有充分的记录。如果您要注意输入,格式化挑剔,并且在检查错误时不懈地检查,那么剩下的唯一错误将是您的逻辑。这就是您想要的。:-)

最新更新