C++ sstream 跳过文件中的前三个输入

C++ sstream skipping first three inputs from a file

本文关键字:输入 三个 sstream 文件 C++      更新时间:2023-10-16

我需要打开这种格式的文件

Dat Nguyen 77.7 88.8 99.9 11.1 22.2
Pat Nguyen 2 3 4 5 6 
我需要将一行的名字分配给结构的成员数组,将行的姓氏分配给结构的另一个成员,将行

的每个数字分配给结构中的分数数组,每个新行都转到结构数组的下一个索引,做同样的事情(对不起,如果我措辞不好)。

我的名字和姓氏分配很好,但是当它将数字分配给结构成员时,它会跳过前三个数字。我做错了什么?

这是我的代码

void fileLoad(Gradebook *students, int &stuCount, int &assignments)
{
ifstream fin;
fin.open("Scores.txt");
if (!fin.is_open())
    cout << "Failed to open file.n";
if (stuCount < 10)
{
    int n = 0;
    string tempLine;
    string line[10];
    while (!fin.eof())
    {
        getline(fin, tempLine);
        line[n] = tempLine;
        stringstream ss(tempLine);
        ss >> students[stuCount].fname >> students[stuCount].lname;
        assignments = 0;
        for (int i = 0; tempLine[i] != ''; i++)
        {
            ss >> students[stuCount].score[assignments];
            if (tempLine[i] == ' ')
                assignments++;
        }
        cout << line[n] << endl;
        assignments--;
        stuCount++;
        n++;
        cout << assignments << endl;
    }
}
else
    cout << "Already max students.n";
}

这是输出

Dat Nguyen 77.7 88.8 99.9 11.1 22.2

Pat Nguyen 2 3 4 5 6

1. Add a new student to the class
2. Assign grades for a new assignment
3. List one student, displaying all their grades and their course average
4. List all the scores for a chosen assignment
5. Display all grades currently contained in the gradebook
6. Save the gradebook to file
7. Exit the program
Enter choice: 3
Enter a student #: 1
Dat Nguyen
Assignment 1: 11.1
Assignment 2: 22.2
Assignment 3: -9.25596e+61
Assignment 4: -9.25596e+61
Assignment 5: -9.25596e+61
Assignment 6: -9.25596e+61
Average: -5.28912e+61

这个逻辑是可疑的:

for (int i = 0; tempLine[i] != ''; i++)
{
    ss >> students[stuCount].score[assignments];
    if (tempLine[i] == ' ')
        assignments++;
}

这将逐个遍历tempLine中的所有字符,并尝试从ss中读取整个单词。想一想:对于每个字符,读一整个单词。 ss包含tempLine的副本,但除此之外,它们是单独的实体。以字大小的块读取ss,在char大小的块中读取tempLine,单词将在循环终止之前很久就用完。由于OP没有测试单词的阅读是否成功,Crom只知道发生了什么。

我认为你想要更多的东西:

while (assignments < MAX_ASSIGMENTS &&
       ss >> students[stuCount].score[assignments])
{ // read all assignments until array full or couldn't read an assignment score 
    assignments++;
}

MAX_ASSIGMENTS 是用于调整score数组大小的任何 OP 的占位符。