C fprintf中的问题传递参数

C fprintf中的问题传递参数,c,C,警告:从不兼容的指针传递“fprintf”的参数2 类型 警告:格式不是字符串文字,也没有格式参数 stdio.h:333:注意:应为“const char*restrict”,但参数的类型为“struct FILE*” #包括 内部主(空){ 文件*文件; 无符号字符*缓冲区; 无符号长文件; //打开文件 file=fopen(“squirrelgray.jpg”、“rb”); 如果(!文件) { fprintf(stderr,“无法打开文件%s”,“squirrel_gray.jpg”);

警告:从不兼容的指针传递“fprintf”的参数2 类型

警告:格式不是字符串文字,也没有格式参数

stdio.h:333:注意:应为“const char*restrict”,但参数的类型为“struct FILE*”

#包括
内部主(空){
文件*文件;
无符号字符*缓冲区;
无符号长文件;
//打开文件
file=fopen(“squirrelgray.jpg”、“rb”);
如果(!文件)
{
fprintf(stderr,“无法打开文件%s”,“squirrel_gray.jpg”);
返回;
}
//获取文件长度
fseek(文件,0,SEEK_END);
fileLen=ftell(文件);
fseek(文件,0,搜索集);
//分配内存
缓冲区=(字符*)(文件长度);
如果(!缓冲区)
{
fprintf(stderr,“内存错误!”);
fclose(文件);
}
fclose(文件);
文件*图像;
图像=fopen(“img.jpg”,“w”);
fprintf(图像、文件);
fclose(图像);
}
行:

fprintf( image, file ) ;
文件
文件*
不是格式字符串。编译器警告的意思与它所说的完全一致(这是一个语义错误)

大概您打算将
buffer
的内容写入img.jpg?在这种情况下:

  • 您尚未将任何数据读入缓冲区
  • 您尚未为缓冲区分配任何内存
  • 格式化I/O在任何情况下都不适合写入二进制文件
也许:

//Allocate memory
buffer = malloc( fileLen ) ;
if( buffer == NULL )
{
    fprintf( stderr, "Memory error!" ) ;
}
else
{
    // Read data from file
    fread( buffer, 1, fileLen, file ) ;

    // Write data to image (img.jpg)
    FILE* image = fopen( "img.jpg", "wb" ) ;
    if( image != NULL )
    {
        fwrite( buffer, 1, fileLen, image ) ;
        fclose( image ) ;
    }
}
fclose( file ) ;

您只需编写一个指向输出文件的文件指针—您需要读取输入文件的内容并将其写入输出文件。请参阅man fread和man fwrite。您需要查看fprintf()的文档。这不是一个很好的使用它。使用fwrite()更有意义。另外,不要将文件长度强制转换为指针。只需直接检查:
如果(fileLen==0)
代码“似乎工作”,但产生不正确的输出。我建议,根据定义,这是不起作用的。关于警告有什么不清楚的?从帖子中删除了模糊的文本,下面的答案很好。+1表示清楚的答案。检查
缓冲区==NULL
很好,即使很少需要。但是,在我看来,
fread()
的结果很可能不像预期的那样,值得检查——甚至比
malloc()
@chux更值得检查:malloc的检查是在原始代码中进行的,否则我可能不会麻烦;全面的错误检查可能会添加大量代码,混淆答案的要点——当然,这不应被视为不在最终代码中执行此操作的许可证。考虑到打开文件的成功性和确定大小的方法,fread看起来可能是一个不太可能的失败点,但仍然应该检查——这是读者的练习!
//Allocate memory
buffer = malloc( fileLen ) ;
if( buffer == NULL )
{
    fprintf( stderr, "Memory error!" ) ;
}
else
{
    // Read data from file
    fread( buffer, 1, fileLen, file ) ;

    // Write data to image (img.jpg)
    FILE* image = fopen( "img.jpg", "wb" ) ;
    if( image != NULL )
    {
        fwrite( buffer, 1, fileLen, image ) ;
        fclose( image ) ;
    }
}
fclose( file ) ;