从txt文件输入的数字。奇怪的故障C ++

时间:2015-05-31 00:11:13

标签: c++ arrays text input struct

这是作业,我已经开发了大部分作业。 我只是不断得到一个奇怪的故障。在下面的输入文件中,我应该取名称和数字,并将它们分为6个不同的变量。将数字转换为字符串,将数字转换为数组,将最后两个数字转换为整数。

当我运行我的程序并想要获取任何字符串的第十个数字时,它会向我提供下一个例如。想要在爱丽丝的成绩中获得94分。

这是文件,这里是代码,请帮忙。

#include <iostream>
#include<string>
#include <fstream>
#include <sstream>

using namespace std;

//all of a students info is stored here
struct Student {
    string name;
    int asgn[9];
    int quiz[9];
    int lab[9];
    int midterm;
    int final;

};
Student s[22];







int main(){

    string str;
    ifstream in;


    in.open("C:/CS161Grades.txt");

    for (int i = 0; i < 22; i++){
        getline(in, str);
        stringstream ss(str);
        ss >> s[i].name >> s[i].asgn[0] >> s[i].asgn[1] >> s[i].asgn[2] >> s[i].asgn[3] >> s[i].asgn[4] >> s[i].asgn[5] >> s[i].asgn[6] >> s[i].asgn[7] >> s[i].asgn[8] >> s[i].asgn[9]
            >> s[i].quiz[0] >> s[i].quiz[1] >> s[i].quiz[2] >> s[i].quiz[3] >> s[i].quiz[4] >> s[i].quiz[5] >> s[i].quiz[6] >> s[i].quiz[7] >> s[i].quiz[8] >> s[i].quiz[9]
            >> s[i].lab[0] >> s[i].lab[1] >> s[i].lab[2] >> s[i].lab[3] >> s[i].lab[4] >> s[i].lab[5] >> s[i].lab[6] >> s[i].lab[7] >> s[i].lab[8] >> s[i].lab[9]
            >> s[i].midterm
            >> s[i].final;

        cout << s[2].name << s[2].lab[9] << endl;
    }







//pause and stop
    getchar();
    getchar();
    return 0;
}

该文件的格式为二十名学生

  Name     Assignments                      Quizzes                          Labs                              MidT  Final

    Alice    71 97 64 30 99 54  8 88 92 94    15 55 91 37 71  1  5 52 37 46     6 19 17 68  7 97 36 31 33 10     72    46

3 个答案:

答案 0 :(得分:0)

1 - 不仅int asgn[9];数组而且int quiz[9];int lab[9];数组只能包含9个元素。但是你试图为每个数组读取10。尝试用以下代码替换你的结构:

struct Student {
string name;
int asgn[10];
int quiz[10];
int lab[10];
int midterm;
int final;

};

或者如果您希望列表大小灵活,可以使用std :: vector。

2 - 您发布的文本文件片段似乎在第一行有标题。因此,您可能需要先读取它们,然后使用while循环从第二行开始读取数据。这比for循环更灵活,因为稍后您可能需要阅读更多学生数据。使用for循环,您将不得不修改循环边界,而使用while循环则不需要:

getline(in, str); // str has the titles if you need them
...
while (getline(in, str)) // Now you are reading the data line by line
{
    // Your code to process str goes here
}

答案 1 :(得分:0)

下面:

int asgn[9];

九个号码(asgn[0]asgn[8])的空间足够了,但您正试图将十个存储在其中。您对asgn[9]的赋值写入数组的末尾,这是未定义的行为。

答案 2 :(得分:0)

好的,所以我修复了你的代码,基本上问题是你对数组的大小和它被索引的事实感到困惑。每个数组有10个元素,因此您需要将表声明为int arr[10]而不是9.但是当您引用它时,arr [9]是第10个元素。得到它了? :)

我为这条糟糕的线路实现了一个快捷方式,它甚至可以更干净但我不想过多地编写你的代码并让你自己思考它。

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

using namespace std;

#define AR_SIZE 10

//all of a students info is stored here
struct Student {
    string name;
    int asgn[AR_SIZE];
    int quiz[AR_SIZE];
    int lab[AR_SIZE];
    int midterm;
    int final;

};
Student s[22];


void fill_array(int *arr, stringstream &ss) {
    for (int idx = 0; idx < AR_SIZE; idx++) {
            ss >> arr[idx];
            cout << arr[idx] << " ";
    }
    cout << "\n";
}

int main(){

    string str;
    ifstream in;


    in.open("test.txt");

    for (int i = 0; getline(in, str); i++) {

        stringstream ss(str);
        ss >> s[i].name;

        fill_array(s[i].asgn, ss);
        fill_array(s[i].quiz, ss);
        fill_array(s[i].lab, ss);

        ss >> s[i].midterm >> s[i].final;

        cout << s[2].name << s[2].lab[9] << endl;
    }


//pause and stop
    getchar();
    getchar();
    return 0;
}