如何从文件中读取行并将其剪切?

时间:2013-12-14 17:32:49

标签: c++ visual-c++

[编辑]

我指定了我的问题,也许它有更多信息:

我有一个包含很多行的文件,比如“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();
}

3 个答案:

答案 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都由空格分隔

您也可以重载>>以便以类似的方式显示内容