我在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不知道输出什么我想..
答案 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