[编辑]
我指定了我的问题,也许它有更多信息:
我有一个包含很多行的文件,比如“string1 string2 int1 int2”,所以一行包含两个字符串和两个整数。我想逐行读取文件并将这四个数据推送到我的struct(它具有相同的变量类型和num)的向量中。我的问题是,我怎么能这样做,因为>>操作员无论如何都不会工作。也不是getline()。
和代码:
void FromFile(string filename)
{
ifstream stream;
stream.open(filename);
adatok adattemp;
while(stream.good())
{
stream >> adattemp.agresszor >> adattemp.vedo >> adattemp.haborukezdete >> adattemp.haboruvege >> ws;
cout << adattemp.agresszor;
vektor.push_back(adattemp);
}
stream.close();
}
答案 0 :(得分:2)
假设每个字符串只是一个单词,这应该有效:
#include <vector>
#include <string>
#include <fstream>
struct Entry {
std::string s1;
std::string s2;
int i1;
int i2;
};
std::vector<Entry> entries;
int main()
{
std::ifstream file("yourfile");
while (file.good()) {
Entry entry;
file >> entry.s1 >> entry.s2 >> entry.i1 >> entry.i2 >> std::ws;
entries.push_back(entry);
}
return 0;
}
注意:在阅读每一行的末尾包含>> std::ws
非常重要。它会占用额外的空白。否则,您最终会在文件末尾添加一个额外的垃圾条目。
编辑:正如Simple在评论中指出的,如果在读取文件时发生任何错误,上面的代码将在vector
的末尾存储垃圾条目。此代码将通过确保在存储条目之前没有错误来解决此问题:
Entry entry;
while (file >> entry.s1 >> entry.s2 >> entry.i1 >> entry.i2 >> std::ws)
{
entries.push_back(entry);
}
答案 1 :(得分:1)
由于您不知道文件大小,因此向量将更适合IMO。
while ( myFile >> string1 >> string2 >> myInt1 >> myInt2 ) {
stringvec1.push_back( string1 );
stringvec2.push_back( string2 );
intvec1.push_back( myInt1 );
intvec2.push_back( myInt2 );
}
编辑:
如果您正在阅读的4个变量对应于特定的逻辑上有意义的类,那么您可以使用一个类/结构的向量,并将所有这4个作为成员。
类似的东西:
struct myFileVariables {
std:string m_string1;
std:string m_string2;
int m_myInt1;
int m_myInt2;
myFileVariables ( string string1, string string2, int myInt1, int myInt2 ) :
m_string1( string1 ), m_string2( string2 ), m_myInt1( myInt1 ),
m_myInt2( myInt2 ) {}
};
在你的主要功能中:
while ( myFile >> string1 >> string2 >> myInt1 >> myInt2 ) {
myFileVariables newEntry( string1, string2, myInt1, myInt2 );
myVec.push_back( newEntry );
}
答案 2 :(得分:1)
我重载>>
并使用std::copy
#include<vector>
#include<algorithm>
//...
struct Reader {
std::string str1;
std::string str2;
int int1;
int int2;
friend std::istream& operator << (std::istream& is, Reader &r)
{
return is >> r.str1 >> r.st2 >> r.int1 >> r.int2 ;
}
};
std::vector<Reader> vec;
std::ifstream fin("file_name");
std::copy(std::istream_iterator<Reader>(fin),
std::istream_iterator<Reader>(),
std::back_inserter(vec)
) ;
这假设所有字符串和int都由空格分隔
您也可以重载>>
以便以类似的方式显示内容