代码将无意义输出到输出文件而不是字符串

Code outputs nonsense to output file instead of string?

本文关键字:输出 字符串 无意义 代码 文件      更新时间:2023-10-16

下面的代码是我必须做的一个项目,我收到一个文本文件,其中有一个学生的名字和姓氏,后面跟着他的成绩。然后,我必须将其转换为包含他的名字和平均分数的输出文件。我收到的文件中有多个学生,它们逐行分布。输出应该类似于

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= 0.000x7fffb08e8698= 0.000x7fffb08e8698

到目前为止我写的是:

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

你有几个bug,它们加在一起导致了你的问题:

  1. 在您的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;放在循环中,所以它每次都被重置。否则你会得到奇怪的复合输出。

  • 你没有使用你的read函数计算的学生数!所以它总是尝试打印10!像这样做:

    int count = read(fin , s);
    print(fout, s, count);
    
  • 如果没有读取分数,我认为你会有一个除以零。

  • 你应该确保不超过size学生被读取。或者更好的是,只是将它们放在std::vector中并从函数返回。

  • 你需要重置i每次你开始阅读一个学生,否则后面的学生会被分割太多。

  • 我不知道这些是不是唯一的问题,但肯定它应该让你开始正确的轨道:-)