Как передать файл в функцию? - PullRequest
5 голосов
/ 11 апреля 2011

Мне трудно понять, как передать файл в функцию.

У меня есть файл с 20 именами и 20 результатами тестов, который должен быть прочитан функцией.Затем функция назначит имена и оценки структуре, называемой «student».

Мой вопрос заключается в том, как бы написать вызов функции с соответствующими параметрами.?чтобы моя функция прочитала данные в файле.спасибо.

КОД

// ask user for student file
cout << "Enter the name of the file for the student data to be read for input" << endl;
cout << " (Note: The file and path cannot contain spaces)" << endl;
cout << endl;
cin >> inFileName;
inFile.open(inFileName);
cout << endl;

// FUNCTION CALL how do i set this up properly?
ReadStudentData(inFile, student, numStudents ); 

void ReadStudentData(ifstream& infile, StudentType student[], int& numStudents)
{
    int index = 0;
    string lastName, firstName;
    int testScore;

    while ((index < numStudents) &&
           (infile >> lastName >> firstName >> testScore))
    {
        if (testScore >= 0 && testScore <= 100)
        {
            student[index].studentName = lastName + ", " + firstName;
            student[index].testScore = testScore;
            index++;
        }
    }

    numStudents = index;
}

Ответы [ 2 ]

2 голосов
/ 17 июля 2013

То, как вы передаете ifstream в функцию, совершенно нормально.

Я подозреваю, что проблема заключается в том, как вы управляете своим массивом StudentType и его размером (numStudents),Я бы порекомендовал изменить код для использования std::vector вместо необработанного массива.В общем, вы всегда должны отдавать предпочтение векторам над массивами, если только у вас нет веской причины использовать массив.

векторы могут расти, чтобы вместить больше данных и отслеживать их размер, поэтому вам не нужно это делать.

Кроме того, для функций рекомендуется возвращать объекты, а не изменять объекты, переданные через список параметров.

#include <vector>
using namespace std;

vector<StudentType> ReadStudentData(ifstream& infile) {
    vector<StudentType> students;
    string lastName, firstName;
    int testScore;
    while (infile >> lastName >> firstName >> testScore) {
        if (testScore >= 0 && testScore <= 100) {
            StudentType student;
            student.studentName = lastName + ", " + firstName;
            student.testScore = testScore;
            students.push_back(student);
        }
    }
    return students;
}

// call the function
vector<StudentType> students = ReadStudentData(infile);

// or if you have a C++11 compiler
auto students = ReadStudentData(infile);

// use students.size() to determine how many students were read
0 голосов
/ 23 ноября 2011

Ссылка на объект файла, кажется, в порядке, но массив объектов StudentType может быть неправильным.Попробуйте это:

void ReadStudentData(ifstream& infile, 
std::vector<StudentType>& vecStudents, 
int& numStudents)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...