3

入力ファイルから読み取り (情報を構造体に格納)、出力ファイルに書き込む次のコードを投稿しました。eofこの関数が安全でないことはわかっているため、この関数を使用してgetline、ファイルの終わりが検出されたかどうかを確認する必要があります。ただし、この特定のコードでは、関数を使用できなかったため、getline最終的に関数に依存しましたeof。したがって、関数の代替案を提案するか、構造体の配列を初期化しようとしているときに関数eofを使用する方法を教えてください。関数を使用する場所を示すために、getline2 つのアスタリスクgetline記号を使用しました。

#include <iostream>
#include <fstream>

using namespace std;
//student structure
struct student
{
  char name[30];
  char course[15];
  int age;
  float GPA;
};

ifstream inFile;
ofstream outFile;

student getData();
void writeData(student writeStudent);
void openFile();

int main (void)
{
  const int noOfStudents = 3; // Total no of students
  openFile(); // opening input and output files

  student students[noOfStudents]; // array of students

  // Reading the data from the file and populating the array
  for(int i = 0; i < noOfStudents; i++)
  {
        if (!inFile.eof()) // ** This where I am trying to use a getline function.
            students[i] = getData();
        else
            break ;
  }


  for(int i = 0; i < noOfStudents; i++)
    writeData(students[i]);

  // Closing the input and output files
  inFile.close ( ) ;
  outFile.close ( ) ;

}

void openFile()
{
  inFile.open("input.txt", ios::in);
  inFile.seekg(0L, ios::beg);
  outFile.open("output.txt", ios::out | ios::app);
  outFile.seekp(0L, ios::end);

  if(!inFile || !outFile)
  {
    cout << "Error in opening the file" << endl;
    exit(1);
  }

}

student getData()
 {
  student tempStudent;
  // temp variables for reading the data from file

  char tempAge[2];
  char tempGPA[5];

  // Reading a line from the file and assigning to the variables
  inFile.getline(tempStudent.name, '\n');
  inFile.getline(tempStudent.course, '\n');
  inFile.getline(tempAge, '\n');

  tempStudent.age = atoi(tempAge);

  inFile.getline(tempGPA, '\n');
  tempStudent.GPA = atof(tempGPA);
  // Returning the tempStudent structure
  return tempStudent;
 }

void writeData(student writeStudent)
 {
  outFile << writeStudent.name << endl;
  outFile << writeStudent.course << endl;
  outFile << writeStudent.age << endl;
  outFile << writeStudent.GPA << endl;
 }
4

2 に答える 2

3

operator>>あなたはあなたの学生タイプのために書きたいです。何かのようなもの:

std::istream& operator>>(std::istream& in, student& s) {
  in >> s.age; // etc.
  return in;
}

次に、次のように記述できます。

int studentNo = 0;
students[maxStudents];
while (studentNo < maxStudents && (in >> students[studentNo]))
  ++studentNo;
于 2012-08-01T19:36:34.720 に答える
0

なぜこのように書かないのですか?

それ以外の

inFile.getline(tempStudent.name, '\n');
inFile.getline(tempStudent.course, '\n');
inFile.getline(tempAge, '\n');

してもいいです

while(inFile.getline(tempStudent.name, '\n'))
{
    inFile.getline(tempStudent.course, '\n');
    inFile.getline(tempAge, '\n');
    //do stuffs
}
于 2012-08-01T19:35:53.897 に答える