C语言函数 fopen

fopen函数为啥在VS2022版本上报错 说不安全

img

#include
#include


int N, i;
struct XUS
{
    char xh[500];
    char xm[500];
    int cj[3];
};


int main()
{



    printf("请输入共几名学生");
    scanf_s("%d", &N);
    XUS* x = new XUS[N]{};
    for (i = 1; i < N + 1; i++)
    {

        printf("请输入第%d名学生的学号:", i);
        scanf_s("%s", &x[i].xh, sizeof(x[i].xh));

        printf("请输入第%d名学生的姓名:", i);
        scanf_s("%s", &x[i].xm, sizeof(x[i].xm));


        printf("请输入第%d名学生的成绩:", i);
        scanf_s("%d", &x[i].cj[0]);
        scanf_s("%d", &x[i].cj[1]);
        scanf_s("%d", &x[i].cj[2]);

        printf("\n");
    }
    FILE* fp;
    fopen("xinxi.txt", "w");
    if (fp == NULL)
    {
        printf("不能打开文件\n");
                                      //表示正常退出

    }
    for (i = 1; i < N + 1; i++)
    {
        fprintf(fp, "%d ", (int)x[i].xh);
        fprintf(fp, "%s ", x[i].xm);
        fprintf(fp, "%d ", x[i].cj[0]);
        fprintf(fp, "%d ", x[i].cj[1]);
        fprintf(fp, "%d ", x[i].cj[2]);
        printf("\n");

    }
    
    fclose(fp);
    

    return 0;
}


fopen("xinxi.txt", "w"); 这句正确的是:fp = fopen("xinxi.txt", "w"); , 才有后面的if (fp == NULL) , 还有其他的输入输出问题,一并修改如下,供参考:

#include<stdio.h>
#include<stdlib.h>
int N, i;
struct XUS
{
    char xh[500];
    char xm[500];
    int cj[3];
};

int main()
{
    printf("请输入共几名学生");
    scanf_s("%d", &N);
    struct XUS* x = new struct XUS[N]{};
    for (i = 0; i < N; i++)  //for (i = 1; i < N + 1; i++) 修改
    {

        printf("请输入第%d名学生的学号:", i + 1);  //printf("请输入第%d名学生的学号:", i); 修改
        scanf_s("%s", x[i].xh, sizeof(x[i].xh));   //scanf_s("%s", &x[i].xh, sizeof(x[i].xh)); 修改

        printf("请输入第%d名学生的姓名:", i + 1);  //printf("请输入第%d名学生的姓名:", i); 修改
        scanf_s("%s", x[i].xm, sizeof(x[i].xm));   //scanf_s("%s", &x[i].xm, sizeof(x[i].xm)); 修改

        printf("请输入第%d名学生的成绩:", i + 1);  //printf("请输入第%d名学生的成绩:", i); 修改
        scanf_s("%d", &x[i].cj[0]);
        scanf_s("%d", &x[i].cj[1]);
        scanf_s("%d", &x[i].cj[2]);
        printf("\n");
    }
    FILE* fp;
    errno_t err;  // 修改   
    err = fopen_s(&fp, "xinxi.txt", "w"); //fopen("xinxi.txt", "w"); 修改
    if (err != 0) //if (fp == NULL)  修改
    {
        printf("不能打开文件\n");
        return  1;  //表示正常退出   修改
    }
    for (i = 0; i < N; i++)     //for (i = 1; i < N + 1; i++) 修改
    {
        fprintf(fp, "%s ", x[i].xh);  //fprintf(fp, "%d ", (int)x[i].xh); 修改
        fprintf(fp, "%s ", x[i].xm);
        fprintf(fp, "%d ", x[i].cj[0]);
        fprintf(fp, "%d ", x[i].cj[1]);
        fprintf(fp, "%d ", x[i].cj[2]);
        printf("\n");
    }
    fclose(fp);
    return 0;
}

跟scanf_s一样,后面加个_s
或者根据提示加个#define

改成:
fopen_s(&fp,"xinxi.txt","w");

两个办法,一个是加上 _s
一个是在编译常数里关掉安全检查
做法:https://blog.csdn.net/qq_43441284/article/details/124870560