C风格文件处理:使用char类型操作字符串读取文件数据遇到故障
问题排查及解决方案
核心错误点
- 存储姓名的数组类型错误:原代码中
char names[128]是一维字符数组,仅能存储单个字符串,无法存储多个独立的姓名字符串,需改为二维字符数组char names[128][20],每个元素存储一个姓名。 fscanf格式符使用错误:原代码用%c仅能读取单个字符,需使用字符串匹配格式符;同时默认%s以空白字符为分隔符,适配本次逗号分隔的输入格式,应使用%[^,]匹配逗号前的所有姓名内容。- 姓名赋值逻辑错误:原代码
*(namesArr + i) = *name仅拷贝了姓名的第一个字符,需使用strcpy函数拷贝整个字符串,需要引入<string.h>头文件。 - 函数参数类型不匹配:
ReadFile的第一个参数需要接收二维字符数组,需将参数类型从char*改为char (*)[20]。 - 打印语句参数错误:
printf输出字符串的%s占位符需要传入字符串首地址,原代码*(names+i)是单个字符,会触发内存访问错误。
修改后可运行代码
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> // 引入字符串处理头文件 using namespace std; // 修改第一个参数类型,适配二维字符数组传参 int ReadFile(char (*)[20],int*,double*); int main() { char names[128][20]; // 二维数组存储多条姓名数据 int ages[128]; double salaries[128]; int size = ReadFile(names, ages, salaries); cout << endl; for(int i = 0; i < size; i++) { printf("My name is %s, and I am %d years old. My salary is $%.2lf\n", names[i], ages[i], salaries[i]); } return 0; } int ReadFile(char (*namesArr)[20], int *ageArr, double *salaryArr) { FILE *IN = fopen("Input.txt", "r"); int i = 0; if(IN == NULL) { cout << "Error! Can't open file."; exit(1); } else { char name[20]; int age = 0; double salary = 0.00; // %[^,]匹配逗号前的所有字符作为姓名,后续匹配年龄、薪资 while(fscanf(IN, "%[^,],%d,%lf\n", name, &age, &salary) != EOF) { strcpy(namesArr[i], name); // 完整拷贝姓名到数组对应位置 ageArr[i] = age; salaryArr[i] = salary; cout << namesArr[i] << " "; i++; } } fclose(IN); return i; }
内容的提问来源于stack exchange,提问作者Ruan Meyer
相关产品推荐
相关产品推荐

