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

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"

问题原因与修复方案

核心问题

  1. 数组维度不匹配:main函数中声明的numbers是double numbers[rows][6],但getData函数的参数定义为double numbers[][8],这会导致内存访问越界,直接破坏letters数组的后续元素。
  2. 数字读取次数错误:每行仅有5个数字,但代码中循环j < 6会尝试读取6个数字,当读到文件末尾时输入流进入失败状态,后续所有读取操作全部失效。
  3. 未检查文件状态:没有判断文件是否成功打开,若文件路径错误或权限不足,读取操作直接失败且无提示。

修复步骤

  1. 修正getData函数的参数维度,与main中的声明保持一致:
    void getData(fstream &inf, string letters[], double numbers[][6], int amount)
    
  2. 调整数字读取循环次数,改为读取5个数字:
    for (int j = 0; j < 5; j++)
    
  3. 添加文件打开检查,避免无效操作:
    if (!inf.is_open()) {
        cerr << "无法打开文件data2.txt" << endl;
        return;
    }
    
  4. (可选)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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:27:36