C fopen未打开文件流。。。我如何解决这个问题?

C fopen未打开文件流。。。我如何解决这个问题?,c,fopen,C,Fopen,我正在尝试编写一个文件并向其添加数据 下面是我的代码片段。thresh是一个无符号的短字符 FILE *fp_th; fp_th = fopen("threshold.txt", "a"); printf("opening file failed: %s\n", strerror(errno)); fprintf(fp_th,"%d ", thresh); fclose(fp_th); 以前它工作得很好,但我修改了一些代码,突然它不再打印了 我已确认fopen没

我正在尝试编写一个文件并向其添加数据

下面是我的代码片段。thresh是一个无符号的短字符

    FILE *fp_th;
    fp_th = fopen("threshold.txt", "a");
    printf("opening file failed: %s\n", strerror(errno));
fprintf(fp_th,"%d ", thresh);
    fclose(fp_th);
以前它工作得很好,但我修改了一些代码,突然它不再打印了

我已确认fopen没有使用打开文件流

printf(" check fp_th = %p \n", fp_th);
它打印出
检查fp_th=00000000

编辑:添加了
printf(“打开文件失败:%s\n”,strerror(errno))在fopen之后。输出显示没有错误。这是谎言吗?奇怪

奇怪的是,我正在编写并附加一个类似的文件,但该文件工作正常。如何解析返回NULL的fopen?为什么会这样?谢谢

首先

fprintf(fp_th,"%d ", thresh);
通常将缓冲输出,直到您关闭文件,或内部文件*缓冲区已满。您可能无法立即在文件中看到任何输出

您可以使用fflush()将文件*写入,以便在您决定时将其写入文件

fprintf(fp_th,"%d ", thresh);
fflush(fp_th);
其次

printf(" check fp_th = %d \n", fp_th);
这不会检查
fp_th
是否无效。它只是将fp_th的指针值打印为有符号整数,-7323824可能与任何值一样好,这将更加没有意义,如果指针的大小与int的大小不同,则可能未定义

要打印指针,应使用%p

printf(" check fp_th = %p \n", fp_th);
如果fopen失败,它将返回NULL,您应该检查它以了解打开文件是否失败

FILE *fp_th;
fp_th = fopen("threshold.txt", "a");
if(fp_th == NULL) {
   printf("opening file failed: %s\n", strerror(errno));
   return;
}
首先

fprintf(fp_th,"%d ", thresh);
通常将缓冲输出,直到您关闭文件,或内部文件*缓冲区已满。您可能无法立即在文件中看到任何输出

您可以使用fflush()将文件*写入,以便在您决定时将其写入文件

fprintf(fp_th,"%d ", thresh);
fflush(fp_th);
其次

printf(" check fp_th = %d \n", fp_th);
这不会检查
fp_th
是否无效。它只是将fp_th的指针值打印为有符号整数,-7323824可能与任何值一样好,这将更加没有意义,如果指针的大小与int的大小不同,则可能未定义

要打印指针,应使用%p

printf(" check fp_th = %p \n", fp_th);
如果fopen失败,它将返回NULL,您应该检查它以了解打开文件是否失败

FILE *fp_th;
fp_th = fopen("threshold.txt", "a");
if(fp_th == NULL) {
   printf("opening file failed: %s\n", strerror(errno));
   return;
}
以前它工作得很好,但我修改了一些代码,突然它不再打印了

如果您的代码更改了当前工作目录,这可能会导致找不到文件,因为您没有提供完整路径。在这种情况下,
fp_th
应该是一个空指针,您可以检查它。您的打印表明它没有返回空指针,而是打开了文件。有关详细信息,请参阅

以前它工作得很好,但我修改了一些代码,突然它不再打印了


如果您的代码更改了当前工作目录,这可能会导致找不到文件,因为您没有提供完整路径。在这种情况下,
fp_th
应该是一个空指针,您可以检查它。您的打印表明它没有返回空指针,而是打开了文件。有关详细信息,请参阅。

首先,始终检查
fopen
的返回值是否为NULL,这意味着失败

要找出文件打开过程中出现的问题,可以使用
perror

  if (fp_th == NULL) {
    perror ("Error opening threshold file");
    exit(EXIT_FAILURE);
  }

如果您仍然无法确定您是否获得了被拒绝的
权限
没有这样的文件或目录
,您可以使用
strace
(假设为Linux)并查找相应的系统调用。

首先,始终检查
fopen
的返回值是否为NULL,这意味着失败

要找出文件打开过程中出现的问题,可以使用
perror

  if (fp_th == NULL) {
    perror ("Error opening threshold file");
    exit(EXIT_FAILURE);
  }

如果您仍然无法确定您是否获得了被拒绝的
权限
没有这样的文件或目录
,您可以使用
strace
(假设为Linux)并查找相应的系统调用。

我今天遇到了类似的问题。我的代码正在打开N-1个文件,但在第N个文件中神秘地崩溃了,尽管该文件确实存在

佩罗透露,我实际上从未关闭过所有这些文件——令我尴尬的是,我忘记了fclose(fd)


到目前为止,我还没有使用perror,但我现在意识到它的价值有多大。:)

我今天也有类似的问题。我的代码正在打开N-1个文件,但在第N个文件中神秘地崩溃了,尽管该文件确实存在

佩罗透露,我实际上从未关闭过所有这些文件——令我尴尬的是,我忘记了fclose(fd)


到目前为止,我还没有使用perror,但我现在意识到它的价值有多大。:)

我想,我的程序中那些不重要的东西。你们只需要知道我想写什么,这是我的变量thresh,一个无符号的short。fprintf处于循环中。然而,fopen远远早于此循环。我的threshold.txt永远不会被创建。有什么想法吗?“我的节目中不重要的东西”著名的临终遗言。哈哈。。。我想相信是这样的。但一次又一次,我知道这会适得其反。然而,我认为,做一个fopen是很简单的(再次事与愿违),当fopen失败时,它会设置
errno
变量。如果失败,请尝试添加以下行(检查fp_th是否为NULL):
perror(“fopen失败”)不要忘了
#包括
编辑:在我的程序中,看看下面祖兰的答案,我认为这不重要。你们只需要知道我想写什么,这是我的变量thresh,一个无符号的short。fprintf处于循环中。然而,fopen远远早于此循环。我的threshold.txt永远不会被创建。有什么想法吗?“我的节目中不重要的东西”著名的临终遗言。哈哈。。。我想相信是这样的。但一次又一次,我知道这会适得其反。然而,我认为,做一个fopen是很简单的(再次适得其反),当fopen失败时,它会设置
errno