C++ 代码仅从源文件读取第一行文本

C++ 代码仅从源文件读取第一行文本,c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,我很确定我的代码是可靠的,应该从我保存的记事本中获取所有内容,但看起来不是这样。我想这也可能是因为它可能将所有内容都包含在我的阵列中,但无法正确打印。谁能指出我的错误在哪里?我不知所措 这是my.txt文件中的文本: 贾森1015252518206 萨曼莎15182916262023 拉维20 26 18 29 10 12 20 希拉17201526182512 安基特16 8 28 20 11 25 21 #包括 #包括 #包括 #包括 使用名称空间std; void getData(ifst

我很确定我的代码是可靠的,应该从我保存的记事本中获取所有内容,但看起来不是这样。我想这也可能是因为它可能将所有内容都包含在我的阵列中,但无法正确打印。谁能指出我的错误在哪里?我不知所措

这是my.txt文件中的文本:

贾森1015252518206
萨曼莎15182916262023
拉维20 26 18 29 10 12 20
希拉17201526182512
安基特16 8 28 20 11 25 21

#包括
#包括
#包括
#包括
使用名称空间std;
void getData(ifstream&inf,字符串n[],双runData[][8],int count);
void calculateAverage(双运行数据[][8],整数计数);
无效打印(字符串n[],双运行数据[][8],整数计数);
int main()
{
字符串名[5];
双runData[6][8];
河流充填;
infle.open(“Lab15Runner.txt”);
如果(!infle)
{

cout您有7个int值,但您尝试读取8[0-7]。您还尝试写入位置[8],此时数组中的最后一个位置为[7]

n[i]         runData[i][j] --> [0]  [1]  [2]  [3]  [4]  [5]  [6] {Length = 7}  
  0   Jason                     10   15   20   25  18   20   26 
  1   Samantha                  15   18   29   16  26   20   23 
  2   Ravi                      20   26   18   29  10   12   20
  3   Sheila                    17   20   15   26  18   25   12 
  4   Ankit                     16    8   28   20  11   25   21
我更改了您的代码,并在更改之前对//进行了注释

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std;

void getData(ifstream& inf, string n[], double runData[][8], int count);
void calculateAverage(double runData[][8], int count);
void print(string n[], double runData[][8], int count);

int main()
{
    string names[5];
    double runData[6][8];

    ifstream inFile;

    inFile.open("Lab15Runner.txt");

    if (!inFile)
    {
        cout << "Cannot open the input file: Lab15Runner.txt." << endl;
        cout << "Program terminates!" << endl;
        return 1;
    }

    cout << fixed << showpoint << setprecision(2);

    getData(inFile, names, runData, 5);
    calculateAverage(runData, 5);
    print(names, runData, 5);

    inFile.close();

    return 0;
}

void getData(ifstream& inf, string n[], double runData[][8], int count)
{
    for (int i = 0; i < count; i++)
    {
        inf >> n[i];

        //CHANGED - reads all 7 values after the name
        for (int j = 0; j < 7; j++) // Old --> for (int j = 0; j < 8; j++)
            inf >> runData[i][j];

        //CHANGED - set the last value (8th position) to 0.0
        runData[i][7] = 0.0; //Old --> runData[i][8] = 0.0;

    }
}

void calculateAverage(double runData[][8], int count)
{
    double sum;

    for (int i = 0; i < count; i++)
    {
        sum = 0.0;
        //CHANGED - sum all 7 values
        for (int j = 0; j < 7; j++) //Old --> for (int j = 0; j < 7; j++)
            sum = sum + runData[i][j];

        //CHANGED - update the 8th position
        runData[i][7] = sum / 7; // Old --> runData[i][8] = sum / 7;
    }
}

void print(string n[], double runData[][8], int count)
{
    double sum = 0.0;

    cout << left << setw(10) << "Name"
        << right << setw(8) << "Day 1"
        << setw(8) << "Day 2"
        << setw(8) << "Day 3"
        << setw(8) << "Day 4"
        << setw(8) << "Day 5"
        << setw(8) << "Day 6"
        << setw(8) << "Day 7"
        << setw(10) << "Average" << endl;

    for (int i = 0; i < count; i++)
    {
        cout << left << setw(10) << n[i];
        cout << right;

        //CHANGED - Print all 7 values
        for (int j = 0; j < 7; j++)// Old --> for (int j = 0; j < 9; j++)
            cout << setw(8) << runData[i][j];

        //CHANGED - print the average (average is at position [i][7], position [i][9] doesn't exist) and added endl at the end
        cout << setw(8) << runData[i][7] << endl;// Old --> cout << setw(8) << runData[i][9];

    }

}
#包括
#包括
#包括
#包括
使用名称空间std;
void getData(ifstream&inf,字符串n[],双runData[][8],int count);
void calculateAverage(双运行数据[][8],整数计数);
无效打印(字符串n[],双运行数据[][8],整数计数);
int main()
{
字符串名[5];
双runData[6][8];
河流充填;
infle.open(“Lab15Runner.txt”);
如果(!infle)
{
cout for(int j=0;j<7;j++)
总和=总和+运行数据[i][j];
//已更改-更新第8个位置
runData[i][7]=sum/7;//旧-->runData[i][8]=sum/7;
}
}
无效打印(字符串n[],双运行数据[][8],整数计数)
{
双和=0.0;

cout您有7个int值,但您尝试读取8[0-7]。您还尝试写入位置[8],此时数组中的最后一个位置为[7]

n[i]         runData[i][j] --> [0]  [1]  [2]  [3]  [4]  [5]  [6] {Length = 7}  
  0   Jason                     10   15   20   25  18   20   26 
  1   Samantha                  15   18   29   16  26   20   23 
  2   Ravi                      20   26   18   29  10   12   20
  3   Sheila                    17   20   15   26  18   25   12 
  4   Ankit                     16    8   28   20  11   25   21
我更改了您的代码,并在更改之前对//进行了注释

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std;

void getData(ifstream& inf, string n[], double runData[][8], int count);
void calculateAverage(double runData[][8], int count);
void print(string n[], double runData[][8], int count);

int main()
{
    string names[5];
    double runData[6][8];

    ifstream inFile;

    inFile.open("Lab15Runner.txt");

    if (!inFile)
    {
        cout << "Cannot open the input file: Lab15Runner.txt." << endl;
        cout << "Program terminates!" << endl;
        return 1;
    }

    cout << fixed << showpoint << setprecision(2);

    getData(inFile, names, runData, 5);
    calculateAverage(runData, 5);
    print(names, runData, 5);

    inFile.close();

    return 0;
}

void getData(ifstream& inf, string n[], double runData[][8], int count)
{
    for (int i = 0; i < count; i++)
    {
        inf >> n[i];

        //CHANGED - reads all 7 values after the name
        for (int j = 0; j < 7; j++) // Old --> for (int j = 0; j < 8; j++)
            inf >> runData[i][j];

        //CHANGED - set the last value (8th position) to 0.0
        runData[i][7] = 0.0; //Old --> runData[i][8] = 0.0;

    }
}

void calculateAverage(double runData[][8], int count)
{
    double sum;

    for (int i = 0; i < count; i++)
    {
        sum = 0.0;
        //CHANGED - sum all 7 values
        for (int j = 0; j < 7; j++) //Old --> for (int j = 0; j < 7; j++)
            sum = sum + runData[i][j];

        //CHANGED - update the 8th position
        runData[i][7] = sum / 7; // Old --> runData[i][8] = sum / 7;
    }
}

void print(string n[], double runData[][8], int count)
{
    double sum = 0.0;

    cout << left << setw(10) << "Name"
        << right << setw(8) << "Day 1"
        << setw(8) << "Day 2"
        << setw(8) << "Day 3"
        << setw(8) << "Day 4"
        << setw(8) << "Day 5"
        << setw(8) << "Day 6"
        << setw(8) << "Day 7"
        << setw(10) << "Average" << endl;

    for (int i = 0; i < count; i++)
    {
        cout << left << setw(10) << n[i];
        cout << right;

        //CHANGED - Print all 7 values
        for (int j = 0; j < 7; j++)// Old --> for (int j = 0; j < 9; j++)
            cout << setw(8) << runData[i][j];

        //CHANGED - print the average (average is at position [i][7], position [i][9] doesn't exist) and added endl at the end
        cout << setw(8) << runData[i][7] << endl;// Old --> cout << setw(8) << runData[i][9];

    }

}
#包括
#包括
#包括
#包括
使用名称空间std;
void getData(ifstream&inf,字符串n[],双runData[][8],int count);
void calculateAverage(双运行数据[][8],整数计数);
无效打印(字符串n[],双运行数据[][8],整数计数);
int main()
{
字符串名[5];
双runData[6][8];
河流充填;
infle.open(“Lab15Runner.txt”);
如果(!infle)
{
cout for(int j=0;j<7;j++)
总和=总和+运行数据[i][j];
//已更改-更新第8个位置
runData[i][7]=sum/7;//旧-->runData[i][8]=sum/7;
}
}
无效打印(字符串n[],双运行数据[][8],整数计数)
{
双和=0.0;

cout
runData[i][8]=0.0;
写入越界,并读取第8个数字(当
j==7
时)将失败,因为
Samantha
不是一个数字,它设置了
failbit
,并导致将来的所有读取也失败。看起来您得到的索引超出了范围,我很惊讶您没有得到运行时错误。标注为[6][8],runData中的范围不应该是[0-5][0-7]?@Fhaab你为什么感到惊讶?未定义的行为是未定义的。不能保证它会崩溃。@BenVoigt它怎么会写越界?我以为我的矩阵有8列?
runData[I][8]=0.0;
写越界,并读取第8个数字(当
j==7
时)将失败,因为
Samantha
不是一个数字,它设置了
failbit
,并导致将来的所有读取也失败。看起来您得到的索引超出了范围,我很惊讶您没有得到运行时错误。标注为[6][8],runData中的范围不应该是[0-5][0-7]?@Fhaab你为什么感到惊讶?未定义的行为是未定义的。不能保证它会崩溃。@BenVoigt它怎么写得越界了?我以为我的矩阵有8列呢?