尝试将.txt文件文本导入字符串二维数组失败,寻求解决方案
问题分析与修正代码
原代码存在的问题
- 循环逻辑错误:外层
while(!file.eof())会重复执行内层38行读取循环,导致数据被多次覆盖;且eof()的判断时机不符合C++文件读取逻辑,应在读取操作后判断是否成功。 - 分隔符使用不当:每行第三个元素后是换行符而非逗号,用逗号作为第三列的读取分隔符时,会将下一行内容一并读入,造成数据错乱。
- 缺少文件打开校验:未检查文件是否成功打开,若文件路径错误或不存在,后续读取操作会直接失败。
修正后的代码
// 仅允许使用这些库 #include <iostream> #include <fstream> #include <string> #include <stdlib.h> using namespace std; int main() { const int rows = 38; const int columns = 3; string companies[rows][columns]; // 读取文件内容 ifstream file; file.open("companies.txt"); // 检查文件是否成功打开 if (!file.is_open()) { cout << "无法打开文件!" << endl; return 1; } // 逐行读取并分割数据 for(int i = 0; i < rows; ++i) { // 先读取整行,避免换行符干扰 string line; if (!getline(file, line)) { // 如果提前读完文件,跳出循环 break; } size_t pos = 0; for(int j = 0; j < columns; ++j) { size_t next_pos = line.find(',', pos); // 处理最后一列(没有后续逗号) if (j == columns - 1) { companies[i][j] = line.substr(pos); } else { companies[i][j] = line.substr(pos, next_pos - pos); pos = next_pos + 1; } } } file.close(); cout << endl << endl; // 显示读取的内容 for(int i = 0; i < rows; ++i) { // 跳过空行(如果文件行数不足38行) if (companies[i][0].empty()) { continue; } for(int j = 0; j < columns; ++j) { cout << companies[i][j] << endl << endl; } } cout << endl << endl; return 0; }
修正说明
- 增加文件打开校验:通过
file.is_open()判断文件是否成功打开,避免无效读取。 - 逐行读取+手动分割:先读取整行文本,再通过
string::find和string::substr手动分割每行的三个元素,完美处理最后一列无逗号的情况。 - 修正循环逻辑:去掉多余的
while(!file.eof())循环,直接用for循环读取指定行数,同时增加读取失败的判断,避免读取空数据。 - 空行过滤:在显示数据时跳过空行,避免文件行数不足38行时输出空内容。
内容的提问来源于stack exchange,提问作者Mr Moon Knight
相关产品推荐
相关产品推荐

