2011-04-11 5 views
5

У меня возникли трудности с пониманием того, как передать файл в функцию.Как передать файл в функцию?

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

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

КОД

// 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

В чем проблема с вашим текущим кодом? Я нахожу это, вы правильно передаете параметры. – iammilind

ответ

0

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

void ReadStudentData(ifstream& infile, 
std::vector<StudentType>& vecStudents, 
int& numStudents) 
2

, как вы пройти 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

У этого есть неприятный запах домашней работы; OP, возможно, не смог использовать векторы, и им предлагалось использовать необработанные массивы .... и на данный момент вопрос составляет 2 года. – Casey

Смежные вопросы