C++文件读取问题:仅能将首行字母存入数组
问题描述
我尝试读取一个包含5行字母和5列数字的文件,仅需将每行的字母存入string类型数组,但目前仅有首行字母被成功存入,其余行无内容。
文件格式
ABC 1 2 3 4 5 DEF 6 7 8 9 10 GHI 11 12 13 14 15 JKL 16 17 18 19 20 MNO 21 23 23 24 25
编写的代码
#include <iostream> #include <fstream> #include <string> using namespace std; void getData(fstream &inf, string letters[], double numbers[][6], int count); int main() { int rows = 5; string letters[rows]; double numbers[rows][6]; fstream inFile; getData(inFile, letters, numbers, rows); return 0; } void getData(fstream &inf, string letters[], double numbers[][8], int amount) { inf.open("data2.txt"); for (int i = 0; i < amount; i++) { //Add only letters to the letters array inf >> letters[i]; for (int j = 0; j < 6; j++) { //Add numbers with to corresponding letters inf >> numbers[i][j]; } } //Print statement for (int i = 0; i < 5; i++) { cout << letters[i] << endl; } }
运行结果
ABC "BLANK LINE" "BLANK LINE" "BLANK LINE" "BLANK LINE"
问题原因与修复方案
核心问题
- 数组维度不匹配:
main函数中声明的numbers是double numbers[rows][6],但getData函数的参数定义为double numbers[][8],这会导致内存访问越界,直接破坏letters数组的后续元素。 - 数字读取次数错误:每行仅有5个数字,但代码中循环
j < 6会尝试读取6个数字,当读到文件末尾时输入流进入失败状态,后续所有读取操作全部失效。 - 未检查文件状态:没有判断文件是否成功打开,若文件路径错误或权限不足,读取操作直接失败且无提示。
修复步骤
- 修正
getData函数的参数维度,与main中的声明保持一致:void getData(fstream &inf, string letters[], double numbers[][6], int amount) - 调整数字读取循环次数,改为读取5个数字:
for (int j = 0; j < 5; j++) - 添加文件打开检查,避免无效操作:
if (!inf.is_open()) { cerr << "无法打开文件data2.txt" << endl; return; } - (可选)C++标准不支持变长数组(如
string letters[rows]),建议改用std::vector提升代码兼容性:vector<string> letters(rows); vector<vector<double>> numbers(rows, vector<double>(5));
修复后的完整代码
#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; void getData(fstream &inf, vector<string>& letters, vector<vector<double>>& numbers, int amount); int main() { int rows = 5; vector<string> letters(rows); vector<vector<double>> numbers(rows, vector<double>(5)); fstream inFile; getData(inFile, letters, numbers, rows); return 0; } void getData(fstream &inf, vector<string>& letters, vector<vector<double>>& numbers, int amount) { inf.open("data2.txt"); if (!inf.is_open()) { cerr << "无法打开文件data2.txt" << endl; return; } for (int i = 0; i < amount; i++) { inf >> letters[i]; for (int j = 0; j < 5; j++) { inf >> numbers[i][j]; } } for (int i = 0; i < amount; i++) { cout << letters[i] << endl; } }
内容的提问来源于stack exchange,提问作者Nill2000
相关产品推荐
相关产品推荐

