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
相关产品推荐
相关产品推荐

