【问题标题】:when trying to write file fprintf does not work尝试写入文件时 fprintf 不起作用
【发布时间】:2020-02-22 19:31:18
【问题描述】:

我只是想在文件中打开并写入一些东西,但是当 Visual Studio 尝试执行 fprintf 程序崩溃时,这是我的代码

#include<stdlib.h>
int main()
{
    FILE* fPointer;
    fPointer = fopen_s(&fPointer,"‪C:\\asd.txt","w");
    fprintf(fPointer, "If ı can read this then ı can create for loop");
    fclose(fPointer);
    return 0;
}

这里是错误信息: Access violation writing location 0x0000003A.

【问题讨论】:

  • 注意编译器警告 - 来自fopen_s 的返回值是分配给fPointer 的错误类型。

标签: c io


【解决方案1】:

fopen_s 返回值是一个错误号,你用你不应该做的事情覆盖你的文件指针。

【讨论】:

  • 是的并且在使用fPointer之前必须检查errno_t(如果成功则为零)。见fopen_s
  • 我正在使用 Visual Studio 并且 fopen_s 是必要的,我会尝试改变它
  • @NBR 也许您将 Microsoft 的 fopen_s 与返回文件指针的标准 fopen 混淆了。在这种情况下,您已经传递了要修改的文件指针的地址
  • @NBR 您可以使用它,只需将其返回值保存到另一个变量并使用它进行错误检查。或者根本不保存它。
【解决方案2】:

与返回数据类型FILE *fopen相比,函数fopen_s返回数据类型errno_t

在您发布的代码中,您将变量fPointer 的地址传递给函数fopen_s,以便它将写入该变量。这是对的。但是,之后,您将函数fopen_s(类型为errno_t)的返回值显式分配给变量fPointer,从而覆盖之前由函数fopen_s 写入该变量的内容。不应这样做,因为数据类型 errno_t 与数据类型 FILE * 的含义不同。

此外,作为一般规则,在使用FILE * 之前,您应该始终检查文件是否已成功打开。

因此,您应该将代码更改为如下所示:

#include <stdlib.h>

int main()
{
    FILE* fPointer;
    errno_t err;

    err = fopen_s(&fPointer,"‪C:\\asd.txt","w");
    if ( err == 0 )
    {
        fprintf(fPointer, "If ı can read this then ı can create for loop");
        fclose(fPointer);
    }
    else
    {
        fprintf( stderr, "Error opening file!\n" );
    }

    return 0;
}

【讨论】:

    【解决方案3】:

    fopen_s 如果未能创建文件指针,则返回错误代码。在使用文件指针之前,您必须检查错误值。

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 2015-03-27
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多