You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言从文本文件读取char和int:程序报EXC_BAD_ACCESS错误

问题分析与修复代码

你的代码存在多个导致崩溃和未定义行为的问题,以下是具体错误和修复方案:

核心错误点

  • 文件打开参数错误:fopen(&"text.txt", "r")写法错误,字符串字面量本身就是指向字符数组的指针,不需要加&,应改为fopen("text.txt", "r")。
  • 变量类型不匹配:char name是单个字符,无法存储"Chris"这类字符串,需定义为字符数组,比如char name[50];。
  • 未解析文件内容:仅读取了buffer但未从中提取数字和名称到number、name变量,直接使用未初始化的变量会触发未定义行为(如崩溃)。
  • printf参数错误:printf("%d %s", &number, name)中,%d需要传入int类型值而非地址&number;%s需要传入字符数组指针,单个char类型的name不符合要求。
  • 函数调用语法错误:add(name, number)末尾缺少分号。
  • 未检查文件状态:若文件不存在或打开失败,fp会是NULL,后续fgets操作会直接崩溃,必须先验证fp有效性。

修复后的代码

#include <stdio.h>

// 示例add函数,需根据实际需求实现逻辑
void add(const char* name, int number) {
    printf("已添加数据:%d %s\n", number, name);
}

void read() {
    int number;
    char name[50]; // 定义足够大的字符数组存储名称
    FILE *fp = fopen("text.txt", "r");

    // 检查文件是否成功打开
    if (fp == NULL) {
        perror("文件打开失败");
        return;
    }

    // 直接从文件读取格式化内容,无需手动解析buffer
    while (fscanf(fp, "%d %s", &number, name) == 2) {
        printf("%d %s\n", number, name);
        add(name, number);
    }

    fclose(fp);
}

额外说明

  • 使用fscanf(fp, "%d %s", &number, name)可直接从文件读取整数和字符串,省去手动解析buffer的步骤,高效且不易出错。
  • name数组的大小可根据实际最长名称长度调整,避免溢出。
  • 必须检查fp是否为NULL,杜绝文件打开失败后的非法内存访问。

内容的提问来源于stack exchange,提问作者Chris Keli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:20:39