【问题标题】:C: fopen() always reurns NULLC: fopen() 总是返回 NULL
【发布时间】:2013-12-09 22:14:48
【问题描述】:

我不知道发生了什么,但每次我用 fopen 打开文件时它都会返回 NULL 但如果我尝试打印地址,则打印有效地址 如果我尝试读写其他文件没有任何反应,我以“w”模式打开它,并为所有用户打开了所有权限。

【问题讨论】:

  • 你在哪里看到fopen返回null???您发布的内容中没有任何内容表明 fpdest 为空。你从哪里得到这个想法的?虽然将 %d 说明符用于 printf 指针是不正确的(为什么使用它?),但您的输出清楚地表明指针不为空

标签: c fopen


【解决方案1】:

在路径名中使用 \\ 而不是 //。在 C 字符串中时,斜杠 ( / ) 符号不需要写两次。另一方面,如果在 C 字符串中使用反斜杠符号 (\),则必须写入两次,以免与转义字符混淆。

我不确定,但我认为 Windows 也接受 / 作为文件名的目录分隔符。

【讨论】:

  • errno 返回“无错误”。 fopen() 不返回 NULL,所以......什么不工作?
  • 顺便说一句:这不是将二进制文件复制到另一个文件的最佳方法。如果 EOF 字符代码出现在源文件中的任何位置怎么办?更好地使用fread()fwrite()
  • EOF 不是一个字符,但你说得对,c 必须是 int,而不是 char
【解决方案2】:

你混淆了语法 - 这些都应该工作:

fp = fopen("D:\\shortcut\\asd.jpg", "r");

fp = fopen("D:/shortcut/asd.jpg", "r");

【讨论】:

    【解决方案3】:

    有一些错误。

    • fetc() 返回一个 int,而不是 char,将 fgetc() 返回值分配给 char 将无法区分 EOF 和文件中的实际字节。

    • 你正在打开二进制文件,所以你需要告诉 fopen() 事实上,默认是以文本模式打开文件。

    • // 不是 Windows 上的目录分隔符,\/ 是。由于 \ 在 C 字符串文字中需要转义,因此需要为 \\

    • 您应该检查fopen是否成功,如果失败则发出相关错误。

    • 你应该发布代码,而不是代码截图。

    做:

    FILE *fp, *dest;
    int c;
    
    if ((fp = fopen("D:\\shortcut\\asd.jpg", "rb")) == NULL) {
        perror("fp fopen");
        return 1;
    }
    if ((dest = fopen("D:\\sssssssssssss.jpg", "wb")) == NULL) {
        perror("dest fopen");
        return 1;
    }
    
    while ((c = fgetc(fp)) != EOF) {
      putc(c, dest); //might even want to check if putc fails.
    }
    
    fclose(dest);
    fclose(fp);
    
    return 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2013-08-05
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多