雷子_w 2023-02-19 09:33 采纳率: 50%
浏览 40
已结题

vs里出现不知如何解决的错误(语言-c语言)

img


fopen 以前不安全 各种方法都试了没用 又出现新问题(应该是上图) 求解答
感谢建议
改动前

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1000;
#define _CRT_SECURE_NO_WARNINGS
int n,num=0;
void query();//查询函数//
void xiugai();//修改函数//
void output();//输出函数//
void input();//输入函数//
void count();//读取文件//
void tuichu();//退出函数//
void menu();//菜单函数//
void deletee();//删除函数//
void ave();//求全班平均值函数//

//学生结构体//
struct student
{
    char name[10]; //姓名
    int number[10]; //学号
    float chinese; //语文成绩 
    float math; //数学成绩 
    float english; // 英语成绩
    float ave;//成绩平均值
    float sum;
} stu[], stu[1];

void count()
{
    FILE* fp;  //定义文件指针fp//
    fp = fopen("students.txt", "at+");     //以“追加”方式打开students文本文件//
    if (fp == NULL)                        //判断文件是否为空//
        printf("Cannot open file!");
    struct student stu1;
    n = 0;         //初始化//
    while (1)
    {
        if (feof(fp))  //检测文件是否结束//
            break;
        fread(&stu1, sizeof(struct student), 1, fp);   //读取文件//
        n++;
    }
    n--;
    fclose(fp); //关闭文件//

}   
void menu() // 菜单 //
{
    int i;
    printf("\t\t欢迎进入学生信息管理系统\n");
    printf("\t\t================================\n");
    printf("\t\t*****     请择操作序号:    *****\n");
    printf("\t\t*       1 输入学生信息         *\n");
    printf("\t\t*       2 输出学生信息         *\n");
    printf("\t\t*       3 修改学生信息         *\n");
    printf("\t\t*       4 查询学生信息         *\n");
    printf("\t\t*       5 删除学生信息         *\n");
    printf("\t\t*      6 查看班级平均分        *\n");
    printf("\t\t*           0 退出             *\n");
    printf("\t\t================================\n");
    scanf_s("%d\n", &i);
    switch (i)
    {
    case 0:tuichu(); break;  //退出系统//
    case 1:input(); break;    //输入学生信息//    
    case 2:output(); break;     //输出学生信息//
    case 3:xiugai(); output(); break;    //修改学生信息//
    case 4:query(); break;  //查询学生信息//
    case 5:deletee(); break;//删除学生信息//
    case 6:
    default:
        printf("输入错误\n");     //错误纠正// 
    }
    
}
void input() //成绩输入//
{
    int i = 0,sum;
    FILE* fp;
    printf("请输入学生的人数:\n");
    scanf_s("%d\n", &sum);
    fp = fopen("student.txt", "at+");
    for (i = 0; i < sum; i++)
    {
        printf("输入学生学号\n");
        scanf_s("%d\n", &stu[i].number);

        printf("输入学生姓名\n");
        scanf_s("%c\n", &stu[i].name);

        printf("输入学生语文成绩\n");
        scanf_s("%f\n", &stu[i].chinese);

        printf("输入学生数学成绩\n");
        scanf_s("%f\n", &stu[i].math);

        printf("输入学生英语成绩\n");
        scanf_s("%f\n", &stu[i].english);

        stu[i].sum = stu[i].chinese + stu[i].math + stu[i].english;
        stu[i].ave = (stu[i].chinese + stu[i].math + stu[i].english) / 3;
        fwrite(&stu[i], sizeof(struct student), 1, fp);
    }
     fclose(fp);
    printf("录入成绩成功!\n");
    system("cls");
}
void output() // 输出 //
{
    int i;
    char c2;
    FILE* fp;     
    fp = fopen("students.txt", "rt");    //读取打开students//
    system("cls");     //清屏//
    printf("请输入\n");
    printf("|*学号---姓名---大学语文----大学数学----大学英语----总成绩----平均分*| \n");
    do {
        for (i = 0; i < n; i++)
        {
            fread(&stu[i], sizeof(struct student), 1, fp);
            printf("%4d", &stu[i].number);
            printf("%8s", &stu[i].name);
            printf("%10.1f", &stu[i].chinese);
            printf("%10.1f ", &stu[i].math);
            printf("%10.1f ", &stu[i].english);
            printf("%10.1f", &stu[i].sum);
            printf("%10.1f ", &stu[i].ave);
            printf("\n");
        }
        printf("\n\n\t\t是否继续(Y/N):");   
        scanf_s("%s", &c2);
        c2 = getchar();
    } while ( c2 == 'Y');
    fclose(fp);      //关闭文件//
}
void xiugai()  //修改//
{
    int i, tp, n;
    FILE* fp;
    printf("请输入要修改学生的学号:");
    scanf_s("%d\n", &n);
    for (i = 0; i < n; i++)
    {
        if (n==*stu[i].number)
        {
            printf("要修改的学生信息为:\n");
            printf("学号\t姓名\t大学语文成绩\t大学数学成绩\t计算机成绩\t总成绩\t平均分\n");
            printf("%4d", stu[i].number);
            printf("%8s", stu[i].name);
            printf("%10.1f", stu[i].chinese);
            printf("%10.1f ", stu[i].math);
            printf("%10.1f", stu[i].sum);
            printf("%10.1f ", stu[i].ave);
            printf("\n");
            do {
                printf("请选择要修改的内容:\n");
                printf("1学号\n2姓名\n3大学语文成绩\n4大学数学成绩\n");
                scanf_s("%d", &tp);
                switch (tp)
                {
                case 1:
                    printf("请输入学号:\n");
                    scanf_s("%d", &stu[i].number);
                    break;
                case 2:
                    printf("请输入姓名:\n");
                    scanf_s("%s", &stu[i].name);
                    break;
                case 3:
                    printf("请输入大学语文成绩:\n");
                    getchar();
                    scanf_s("%f", &stu[i].chinese);
                    stu[i].sum = stu[i].chinese + stu[i].math ;
                    stu[i].ave = (stu[i].chinese + stu[i].math ) / 3;
                    break;
                case 4:
                    printf("请输入大学数学成绩:\n");
                    scanf_s("%f", &stu[i].math);
                    stu[i].sum = stu[i].chinese + stu[i].math;
                    stu[i].ave = (stu[i].chinese + stu[i].math ) / 3;
                    break;
        
                }
            } while (tp < 5);
        }
    }
    fp = fopen("students.txt", "w+");   //以写方式打开students//
    for (i = 0; i < n; i++)
        fwrite(&stu[i], sizeof(struct student), 1, fp);  
    fclose(fp);    //关闭文件//

}
void query()// 查找 //
{
    int i, n;
    FILE* fp;
    char c3;
    fp = fopen("students.txt", "rt");    //读取打开students//
    system("cls");     //清屏//
    printf("请输入学生的学号:");
    scanf_s("%d", &n);
    for (i = 1;; i++)
    {
        if (n== *stu[i].number)
        {
            fread(&stu[i], sizeof(struct student), 1, fp);
            printf("该学生学号为%d\n", i);
            printf_s("该学生的大学语文成绩为:%10.1f\n", &stu[i].chinese);
            printf_s("大学数学成绩为:%10.1f\n", &stu[i].math);
            printf_s("大学英语成绩为:%10.1%f\n", &stu[i].english);
            printf_s("平均分为:%10.1f\n", &stu[i].ave);

        }
        printf("\n\n\t\t是否继续(Y/N):");
        scanf_s("%s", &c3);
        c3 = getchar();
        if (c3 == 'Y')
        fclose(fp);      //关闭文件//
    }
}

    void deletee() //删除//
    {
        int i, n;
        char c4;
        FILE* fp;
        fp = fopen("students.txt", "w+");
        printf("请输入你要删除学生的学号:\n");
        scanf_s("%d\n", &n);
        for (i = 0;; i++) 
        {
            if (n == *stu[i].number)
            {
                printf("确认删除学号为%d学生的成绩?\n", n);
                printf("Y or N\n");
                scanf_s("%c", &c4);
                c4 = getchar();
                if (c4 == 'Y')
                {
                    for (i = 1;; i++)
                        stu[i] = stu[i + 1];

                }num--;
            } else printf("输入错误!学生不存在!\n");
        }
        fclose(fp);
    }
    void ave()//全班平均分//
    {
        int i, n,sum;
        float C=0, M=0, E=0;//表示语文 数学 英语 的总分//
        printf("输入学生人数:\n");
        scanf_s("%d\n", &sum);
        FILE* fp;
        fp = fopen("students.txt", "rt");    //读取打开students//
        system("cls");     //清屏//
        for(i=0;i<=sum;i++)
        {
            C = stu[i].chinese + C;
            M = stu[i].math + M;
            E = stu[i].english + E;
        }
        printf("全班语文成绩平均值为:%10.1d\n", C / sum);
        printf("全班数学成绩平均值为:%10.1d\n", M / sum);
        printf("全班英语成绩平均值为:%10.1d\n", E / sum);
        fclose(fp);
     }

改动后

img

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1000;
int n, num = 0;
void query();//查询函数//
void xiugai();//修改函数//
void output();//输出函数//
void input();//输入函数//
void count();//读取文件//
void tuichu();//退出函数//
void menu();//菜单函数//
void deletee();//删除函数//
void ave();//求全班平均值函数//

//学生结构体//
struct student
{
    char name[10]; //姓名
    int number[10]; //学号
    float chinese; //语文成绩 
    float math; //数学成绩 
    float english; // 英语成绩
    float ave;//成绩平均值
    float sum;
}  stu[1];

void count()
{
    FILE* fp;  //定义文件指针fp//
    fp = fopen_s(&fp,"C:/hi/students.doc", "at+");     //以“追加”方式打开students文本文件//
    if (fp == NULL)                        //判断文件是否为空//
        printf("Cannot open file!");
    struct student stu1;
    n = 0;         //初始化//
    while (1)
    {
        if (feof(fp))  //检测文件是否结束//
            break;
        fread(&stu1, sizeof(struct student), 1, fp);   //读取文件//
        n++;
    }
    n--;
    fclose(fp); //关闭文件//

}
void menu() // 菜单 //
{
        int i;
        system("cls");
        printf("\t\t欢迎进入学生信息管理系统\n");
        printf("\t\t================================\n");
        printf("\t\t*****     请择操作序号:    *****\n");
        printf("\t\t*       1 输入学生信息         *\n");
        printf("\t\t*       2 输出学生信息         *\n");
        printf("\t\t*       3 修改学生信息         *\n");
        printf("\t\t*       4 查询学生信息         *\n");
        printf("\t\t*       5 删除学生信息         *\n");
        printf("\t\t*      6 查看班级平均分        *\n");
        printf("\t\t*           0 退出             *\n");
        printf("\t\t================================\n");
        scanf_s("%d\n", &i);
        system("cls");
        count();
        switch (i)
        {
        case 0:tuichu(); break;  //退出系统//
        case 1:input(); break;    //输入学生信息//    
        case 2:output(); break;     //输出学生信息//
        case 3:xiugai(); output(); break;    //修改学生信息//
        case 4:query(); break;  //查询学生信息//
        case 5:deletee(); break;//删除学生信息//
        case 6:ave(); break;//班级平均分//
        default:
            printf("输入错误\n");     //错误纠正// 
        }
}
void input() //成绩输入//
{
    int i = 0, sum;
    char c;
    FILE* fp;
    count();
    printf("请输入学生的人数:\n");
    scanf_s("%d\n", &sum);
    fp = fopen_s(&fp, "C:/hi/students.doc", "at+");
    for (i = 0; i < sum; i++, n++)
    {
        printf("输入学生学号\n");
        scanf_s("%d\n", &stu[i].number);

        printf("输入学生姓名\n");
        scanf_s("%s\n", &stu[i].name); getchar();

        printf("输入学生语文成绩\n");
        scanf_s("%f\n", &stu[i].chinese);

        printf("输入学生数学成绩\n");
        scanf_s("%f\n", &stu[i].math);

        printf("输入学生英语成绩\n");
        scanf_s("%f\n", &stu[i].english);

        stu[i].sum = stu[i].chinese + stu[i].math + stu[i].english;
        stu[i].ave = (stu[i].chinese + stu[i].math + stu[i].english) / 3;
        fwrite(&stu[i], sizeof(struct student), 1, fp);
    }
    fclose(fp);
    printf("录入成绩成功!\n");
    system("cls");
}
void output() // 输出 //
{
    int i;
    FILE* fp;
    fp = fopen_s(&fp, "C:/hi/students.doc", "rt");    //读取打开students//
    system("cls");    //清屏//
    printf("请输入\n");
    printf("|*学号---姓名---大学语文----大学数学----大学英语----总成绩----平均分*| \n");
    for (i = 0; i < n; i++)
    {
        fread(&stu[i], sizeof(struct student), 1, fp);
        printf("%12d", stu[i].number);
        printf("%12s", stu[i].name);
        printf("%10.1f", stu[i].chinese);
        printf("%10.1f ", stu[i].math);
        printf("%10.1f ", stu[i].english);
        printf("%10.1f", stu[i].sum);
        printf("%10.1f ", stu[i].ave);
        printf("\n");
    }
    fclose(fp);      //关闭文件//
}
void xiugai()  //修改//
{
    int i, tp, num;
    FILE* fp;
    printf("请输入要修改学生的学号:");
    scanf_s("%d\n", &num);
    for (i = 0; i < n; i++)
    {
        if (n == *stu[i].number)
        {
            printf("要修改的学生信息为:\n");
            printf("学号\t姓名\t大学语文成绩\t大学数学成绩\t大学英语成绩\t总成绩\t平均分\n");
            printf("%12d", num);
            printf("%12s", stu[i].name);
            printf("%10.1f", stu[i].chinese);
            printf("%10.1f ", stu[i].math);
            printf("%10.1f", stu[i].sum);
            printf("%10.1f ", stu[i].ave);
            printf("\n");
            do {
                printf("请选择要修改的内容:\n");
                printf("1学号\n2姓名\n3大学语文成绩\n4大学数学成绩\n5大学英语成绩\n");
                scanf_s("%d", &tp);
                switch (tp)
                {
                case 1:
                    printf("请输入学号:\n");
                    scanf_s("%d", &stu[i].number);
                    break;
                case 2:
                    printf("请输入姓名:\n");
                    scanf_s("%s", &stu[i].name);
                    break;
                case 3:
                    printf("请输入大学语文成绩:\n");
                    scanf_s("%f", &stu[i].chinese);
                    stu[i].sum = stu[i].chinese + stu[i].math + stu[i].english;
                    stu[i].ave = (stu[i].chinese + stu[i].math + stu[i].english) / 3;
                    break;
                case 4:
                    printf("请输入大学数学成绩:\n");
                    scanf_s("%f", &stu[i].math);
                    stu[i].sum = stu[i].chinese + stu[i].math + stu[i].english;
                    stu[i].ave = (stu[i].chinese + stu[i].math + stu[i].english) / 3;
                    break;
                case 5:
                    printf("请输入大学英语成绩:\n");
                    scanf_s("%f", &stu[i].english);
                    stu[i].sum = stu[i].chinese + stu[i].math + stu[i].english;
                    stu[i].ave = (stu[i].chinese + stu[i].math + stu[i].english) / 3;
                    break;

                }
            } while (tp < 6);
        }
    }
    fp = fopen_s(&fp, "C:\hi\students.doc", "w+");   //以写方式打开students//
    for (i = 0; i < n; i++)
        fwrite(&stu[i], sizeof(struct student), 1, fp);
    fclose(fp);    //关闭文件//

}
void query()// 查找 //
{
    int i, n;
    FILE* fp;
    char c3;
    fp = fopen_s(&fp, "C:/hi/students.doc", "rt");    //读取打开students//
    system("cls");     //清屏//
    printf("请输入学生的学号:");
    scanf_s("%d", &n);
    for (i = 1;; i++)
    {
        if (n == *stu[i].number)
        {
            fread(&stu[i], sizeof(struct student), 1, fp);
            printf("该学生学号为%d\n", i);
            printf_s("该学生的大学语文成绩为:%10.1f\n", &stu[i].chinese);
            printf_s("大学数学成绩为:%10.1f\n", &stu[i].math);
            printf_s("大学英语成绩为:%10.1%f\n", &stu[i].english);
            printf_s("平均分为:%10.1f\n", &stu[i].ave);

        }
        printf("\n\n\t\t是否继续(Y/N):");
        scanf_s("%s", &c3);
        c3 = getchar();
        if (c3 == 'Y')
            fclose(fp);      //关闭文件//
    }
}

void deletee() //删除//
{
    int i, n;
    char c4;
    FILE* fp;
    fp = fopen_s(&fp, "C/hi/students.doc", "w+");
    printf("请输入你要删除学生的学号:\n");
    scanf_s("%d\n", &n);
    for (i = 0;; i++)
    {
        if (n == *stu[i].number)
        {
            printf("确认删除学号为%d学生的成绩?\n", n);
            printf("Y or N\n");
            c4 = getchar();
            if (c4 == 'Y')
            {
                for (i = 1;; i++)
                    stu[i] = stu[i + 1];

            }num--;
        }
        else printf("输入错误!学生不存在!\n");
    }
    fclose(fp);
    system("cls");     //清屏//
}
void ave()//全班平均分//
{
    int i, n, sum;
    float C = 0, M = 0, E = 0;//表示语文 数学 英语 的总分//
    printf("输入学生人数:\n");
    scanf_s("%d\n", &sum);
    FILE* fp;
    fp = fopen_s(&fp, "C:/hi/students.doc", "rt");    //读取打开students//
    system("cls");     //清屏//
    for (i = 0; i <= sum; i++)
    {
        C = stu[i].chinese + C;
        M = stu[i].math + M;
        E = stu[i].english + E;
    }
    printf("全班语文成绩平均值为:%10.1d\n", C / sum);
    printf("全班数学成绩平均值为:%10.1d\n", M / sum);
    printf("全班英语成绩平均值为:%10.1d\n", E / sum);
    fclose(fp);
    system("cls");     //清屏//
}
void tuichu() //退出//
{
    char c;
    system("cls");
    printf("\n\t 感谢使用");
    getchar();
    c = getchar();
}

  • 写回答

2条回答 默认 最新

  • qq_46161207 2023-02-19 09:57
    关注

    您好,这个错误的原因是在使用 fopen() 函数时,使用了一个字符串字面量作为文件名,而该字符串字面量包含非法字符(在这个错误中,是反斜杠)。

    要解决这个错误,您可以使用两种方法之一:

    1.将文件路径中的反斜杠替换为正斜杠。
    例如:"C:\myfolder\myfile.txt" 应改为 "C:/myfolder/myfile.txt"

    2.在反斜杠前面添加另一个反斜杠,以转义反斜杠。
    例如:"C:\myfolder\myfile.txt" 应改为 "C:\\myfolder\\myfile.txt"

    请注意,第二种方法可能会更加繁琐,因为需要在字符串中添加更多的字符。

    另外,您提到 fopen() 函数以前不安全。如果您使用的是最新版本的 Visual Studio,则可能会建议您使用 fopen_s() 函数代替 fopen() 函数,以提高安全性。例如:

    FILE* fp;
    errno_t err = fopen_s(&fp, "C:/myfolder/myfile.txt", "r");
    if (err == 0) {
        // 文件打开成功
        // 进行读写操作
        fclose(fp);
    } else {
        // 文件打开失败
        // 处理错误
    }
    

    fopen_s() 函数的第一个参数是文件指针,第二个参数是文件名,第三个参数是打开方式,与 fopen() 函数的参数相同。fopen_s() 函数的返回值是一个错误代码,如果打开成功,则为 0。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 已采纳回答 2月21日
  • 修改了问题 2月21日
  • 修改了问题 2月20日
  • 展开全部

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3