2011-04-11 14 views
5

Mam trudności ze zrozumieniem, jak przekazać plik do funkcji.Jak przekazać plik do funkcji?

Mam plik z 20 nazwami i 20 wynikami testów, które muszą być odczytane przez funkcję. funkcja następnie przypisze imiona i wyniki do struktury zwanej uczniem.

moje pytanie brzmi: jak napisałbym wywołanie funkcji z odpowiednimi parametrami. ? aby moja funkcja odczytała dane w pliku. dzięki.

KOD

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

na jaki problem napotykasz przy bieżącym kodzie? Uważam, że poprawnie przekazujesz parametry. – iammilind

Odpowiedz

0

Odniesienie do obiektu pliku wydaje się być w porządku, ale tablica StudentType obiektów może źle. Spróbuj tego:

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

Sposób zdać ifstream do funkcji jest idealnie czysty.

Podejrzewam, że problem leży w sposobie zarządzania macierzą StudentType i jej rozmiarem (numStudents). Zaleciłbym zmianę kodu, aby używał std::vector zamiast surowej tablicy. Ogólnie rzecz biorąc, zawsze powinieneś preferować wektory w stosunku do tablic, chyba że masz naprawdę dobry powód, aby użyć tablicy.

Wektory mogą rosnąć, aby pomieścić więcej danych i śledzić ich rozmiar, dzięki czemu nie musisz.

Warto również, aby funkcje zwracały obiekty, a nie modyfikowały obiekty przekazywane przez listę parametrów.

#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

Ma to zapach pracy domowej; OP mógł nie być w stanie używać wektorów i kazano mu używać surowych tablic ... a na tym etapie pytanie ma 2 lata. – Casey

Powiązane problemy