fprintf调试断言失败

4
我有一个程序,如果我手动启动它,它可以正确运行。然而,如果我尝试添加一个注册表键来在启动期间自动启动它,我会收到以下错误提示:
Debug assertion failed (str!=null) fprintf.c line:55

我尝试在任何操作之前添加Sleep(20000),但是我仍然收到相同的错误消息。
以下是代码:
main()
{
    FILE* filetowrite;
    filetowrite = fopen("textfile.txt", "a+");

    writefunction(filetowrite);
}

int writefunction(FILE* filetowrite) {

    fprintf(filetowrite, "%s", "\n\n");
    ...
}

我也尝试将文件名作为char*传递,并在writefunction()中打开它,但是我仍然得到相同的错误。


4
你是否尝试过检查你实际上是否正在打开 "textfile.txt" 这个文件? - Elalfer
1
它可能没有在你认为的文件夹中启动。我怀疑 C:\Windows\System32\textfile.txt 存在 :). (或者运行目录是什么。) - Corbin
使用相同的代码出现错误: fopen_s(&filetowrite,"textfile.txt", "a+"); - Kolt
如果我手动启动它,它会打开文件并将所有内容写入。 - Kolt
1
做一些适当的调试。检查实际路径,而不是相对路径,看它正在寻找哪个文件。99.999999999999%的几率是可执行文件没有以你认为的工作目录运行。或者,这可能是一个权限错误。 - Corbin
使用完整路径,它可以很好地工作。谢谢大家。 - Kolt
2个回答

8

fopen 函数调用失败。您应该始终检查返回值以查看其是否正常工作:

filetowrite = fopen("textfile.txt", "a+");
if (filetowrite == NULL) {
    // log something, including errno
    exit (1);
}
< p > VC++中fprintf.c的第55行是:

_VALIDATE_RETURN( (str != NULL), EINVAL, -1);

其中strFILE *参数(好一个变量名,Microsoft,你到底在想什么?)。

我怀疑尝试通过注册表运行它时可能会有权限问题或类似的问题(可能在RunRunOnce或作为服务下运行)。

一旦你弄清了实际错误是什么,解决方案应该就更容易产生了。

如果是权限问题,你可以使用类似c:\\a\\directory\\i\\KNOW\\i\\can\\write\\to\\textfile.txt这样的东西来查找,看看是否正常工作。然后你也可以使用那个文件来记录像当前目录这样的信息。

如果发现"background"启动方法在错误的目录中,那么将改变目录作为您的程序的第一个操作之一。


1
以下内容应该可以解决您的问题:
  1. check if the directory holding your file has the right permission.
  2. use real full path when you use fprintf

     filetowrite = fopen("c:\\textfile.txt", "a+");
    
  3. run your IDE in Administrator mode (or run you EXE in Administrator mode)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接