在.txt文件中逐字读取C ++中的结构

时间:2011-10-30 21:13:23

标签: c++ string file-io input vector

我在CMPT课程的实验室工作中遇到了一些麻烦...... 我正在尝试读取一个文本文件,每行有两个单词和一串数字,文件可以和任何人一样长。

一个例子是

Xiao Wang 135798642
Lucie Chan 122344566
Rich Morlan 123456789
Amir Khan 975312468
Pierre Guertin 533665789
Marie Tye 987654321

我必须让每一行成为一个单独的“学生”,所以我想使用struct这样做,但我不知道该怎么做,因为我需要将第一个,最后一个和ID号分开

struct Student{
    string firstName;
    string secondName;
    string idNumber;
};

所有单独读取每个单词的尝试都失败了(最后读完了整行)我感到有点沮丧。

在@Sylence的帮助下,我成功地分别阅读了每一行。我仍然对如何通过空白分割线条感到困惑。 ifstream中是否存在拆分功能? Sylence,'部分'将成为一个阵列?我看到你在[]中有索引。 students.add( stud )究竟做了什么? 到目前为止我的代码是:

int getFileInfo()
{
    Student stdnt;
    ifstream stdntFile;
    string fileName;
    char buffer[256];
    cout<<"Please enter the filename of the file";
    cin>>filename;
    stdntFile.open(fileName.c_str());
    while(!stdFile.eof())
    {
        stdFile.getLine(buffer,100);
    }
    return 0;
}

这是我修改过的最终版本的getFileInfo(),谢谢Shahbaz,方便快捷地读取数据。

void getFileInfo()
{
    int failed=0;
    ifstream fin;
    string fileName;
    vector<Student> students; // A place to store the list of students

Student s;                  // A place to store data of one student
cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl;
do{
    if(failed>=1)
        cout<<"Please enter a correct filename."<<endl;
    cin>>fileName;
fin.open(fileName.c_str());// Open the file
failed++;
}while(!fin.good());
while (fin >> s.firstName >> s.lastName >> s.stdNumber)
    students.push_back(s);
fin.close();
cout<<students.max_size()<<endl<< students.size()<<endl<<students.capacity()<<endl;


return;
}

我现在感到困惑的是如何访问输入的数据!我知道它被放入一个向量中,但是如何访问向量中的各个空格,以及输入的数据究竟是如何存储在向量中的?如果我尝试cout一个矢量点,我得到一个错误,因为Visual Studio不知道输出什么我想..

3 个答案:

答案 0 :(得分:2)

其他答案都很好,但看起来有点复杂。您可以通过以下方式完成:

vector<Student> students;   // A place to store the list of students

Student s;                  // A place to store data of one student

ifstream fin("filename");   // Open the file

while (fin >> s.firstName >> s.secondName >> s.idNumber)
    students.push_back(s);

请注意,如果istream失败,例如文件完成时,istream对象(fin)将评估为false。因此,while (fin >> ....)将在文件完成时停止。

P.S。不要忘记检查文件是否打开。

答案 1 :(得分:1)

为学生定义流阅读器:

std::istream& operator>>(std::istream& stream, Student& data)
{
    std::string line;
    std::getline(stream, line);

    std::stringstream   linestream(line);
    linestream >> data.firstName >> data.secondName >> data.idNumber;

    return stream;
}

现在,您应该能够从任何流中流式传输对象,包括文件:

int main()
{
    std::ifstream    file("data");
    Student          student1;

    file >> student1;   // Read 1 student;

    // Or Copy a file of students into a vector
    std::vector<Student>   studentVector;
    std::copy(std::istream_iterator<Student>(file),
              std::istream_iterator<Student>(),
              std::back_inserter(studentVector)
             );
}

答案 2 :(得分:0)

只需读取整行,然后在空格处拆分字符串,并将值分配给结构体的对象。

伪代码:

while( !eof )
   line = readline()
   parts = line.split( ' ' )

   Student stud = new Student()
   stud.firstName = parts[0]
   stud.secondName = parts[1]
   stud.idNumber = parts[2]  

   students.add( stud )     
end while