【问题标题】:Number input from txt file. Weird glitch C++来自 txt 文件的数字输入。奇怪的故障 C++
【发布时间】:2015-08-13 16:16:16
【问题描述】:

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

当我运行我的程序并想要获取任何字符串的第十个数字时,它会向我显示下一个数字,例如。希望 94 在 Alice 的成绩中得到 15。

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

#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;
}

该文件的格式与 20 名学生相同

  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

【问题讨论】:

  • 输入行太长了,太糟糕了。你为什么不循环???

标签: c++ arrays text input struct


【解决方案1】:

这里:

int asgn[9];

这对于 9 个 个数字(asgn[0]asgn[8])来说已经足够了,但是您正试图在其中存储 10 个数字。您对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;
    }
    

    【讨论】:

      【解决方案3】:

      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 - 您发布的文本文件 sn-p 似乎在第一行有标题。因此,您可能希望先读取它们,然后使用 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
      }
      

      【讨论】:

      • 感谢所有非常有帮助的人,我认为它就像 0 - 9,意味着十个变量非常感谢您的帮助。
      猜你喜欢
      • 2019-11-22
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多