以下代码用于我必须做的项目,在该项目中,我收到一个文本文件,该文件包含学生的名字和姓氏,然后是他的成绩。然后,我必须将其转换为包含他的名字和他的平均分数的输出文件。我收到的文件有很多学生,一行一行地写着。输出应该相对地看起来像

Rzam, Look           = 0.00
Bambi, Lambi         = 40.47
Coop, Jason          = 27.31


但是我只是在打印垃圾

0x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 090x

这是我到目前为止的内容:

#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>

using namespace std;

struct Student
{
    string fname;
    string lname;
    double average;
};

int read(ifstream &fin, Student s[]);

void print(ofstream &fout, Student s[], int amount);


int main()
{
    const int size = 10;
    ifstream fin;
    ofstream fout;
    string inputFile;
    string outputFile;
    Student s[size];

    cout << "Enter input filename: ";
    cin >> inputFile;
    cout << "Enter output filename: ";
    cin >> outputFile;
    cout << endl;

    fin.open(inputFile.c_str());
    fout.open(outputFile.c_str());

    read(fin , s);
    print(fout, s, size);

    fin.close();
    fout.close();

}

int read(ifstream &fin, Student s[])
{
    string line;
    string firstName;
    string lastName;
    double score;
    double total;
    int i=0;
    int totalStudents=0;
    Student stu;

    while(getline(fin, line)){
        istringstream sin;
        sin.str(line);

        while(sin >> firstName >> lastName){
            stu.fname = firstName;
            stu.lname = lastName;

            while(sin >> score){
            total *= score;
            i++;
            }
            stu.average = (total/i);
        }
        s[totalStudents]=stu;
        totalStudents++;
    }
    return totalStudents;
}

void print(ofstream &fout, Student s[], int amount)
{
    ostringstream sout;
    for(int i = 0; i<amount; i++)
    {
        sout << left << setw(20) << s[i].lname << ", " << s[i].fname;
        fout << sout << setprecision(2) << fixed << "= " << s[i].average;
    }
}

最佳答案

您有一些错误,这些错误加在一起就是您的问题:


print函数中,您写入ostringstream,然后尝试将其写入文件流。很好,但是它正在打印ostringstream缓冲区的地址。因此,进行此更改将导致其打印内容:

fout << sout.str() << setprecision(2) << fixed << "= " << s[i].average;



注意.str()的用法。虽然您根本不需要临时流...


您无需在输出中放置换行符,因此它们都以一行结尾,从而难以阅读:


因此,请进行其他更改,使其看起来像这样:

fout << sout.str() << setprecision(2) << fixed << "= " << s[i].average << '\n';



您需要将ostringstream sout;放入循环中,因此每次也都将其重置。否则,您将获得奇怪的复合输出。
您不使用通过阅读功能计算的学生人数!因此它总是尝试打印10!做这样的事情:

int count = read(fin , s);
print(fout, s, count);

如果未读到分数,我想您将被零除。因此,您应该添加一张支票。
您应该确保阅读的学生不超过size个。或者更好的方法是,将它们放在std::vector中,然后从函数中返回。它更简单,错误更少。
每次开始阅读学生时,您都需要重置i,否则以后的学生会被过多地划分。每个都需要有一个独立的计数。


我不知道这些是否是唯一的问题,但是可以肯定的是,它应该使您开始正确的轨道:-)

关于c++ - 代码将废话输出到输出文件而不是字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40353633/

10-11 15:35