无法将文件流作为函数参数传递?

时间:2016-11-01 01:41:16

标签: c++ string file inputstream filestream

这是我的作业代码。每当我尝试编译时,由于" ios_base.h"中的某些内容,我的读取功能会出错。我不知道该怎么做和/或我的代码是否具有获取文件并将其移动到一个单独的文件中的预期功能,该文件的名称和平均值彼此相邻。

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

using namespace std;

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

int read(ifstream, 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, read(fin, s));

}

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

2 个答案:

答案 0 :(得分:3)

流对象不可复制。他们的拷贝构造函数被删除。它们必须通过引用传递,而不是通过值传递:

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

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

等...

答案 1 :(得分:0)

Sam Varshavchik 的回答是正确的,但他没有提到为什么 流对象不允许您复制它们。

这里的问题是流对象拥有缓冲区,而缓冲区无法安全复制。

举个例子,假设你有数据通过网络套接字传入,并且在它前面有一个缓冲区,你复制了这个缓冲读取器。如果您从副本中读取,它将读取一些不确定数量的数据并将其放入缓冲区。这个数据现在从网络套接字中消失了,只存在于缓冲区中。现在假设您阅读了副本。然后,您会在读取原始数据之后获得一些不确定的数据。以这种方式来回切换,您会得到两个“流”,其中有其他读者正在读取数据的间隙。