如何读取具有特定格式的行)c ++

时间:2017-10-31 08:47:01

标签: c++

我在阅读c ++中的txt文件时遇到了问题。

该文件由行组成,每行包含4个数字,代表一年(例如1900),电影标题用'#'分隔。

文件格式为: 编号#电影标题#电影标题#电影标题

行的例子:

  

1900 #Sherlock Holmes感到困惑#The Enchanted Drawing

     

1904年#The Impossible Voyage

     

1918#Stella Maris #Mickey #Shifting Sands #A Dog's Life#Shoulder Arms

我想阅读每一行,将年份保存在int变量中,将每个电影标题保存在字符串数组中。请帮忙。

这是我的(错误)代码:

istream& operator >>(istream &is, Cronologia &crono){

    FechaHistorica fh;
    int anio;
    while(!is.eof()){
        char  c[1024];
        char  aux[4];

        is.read(aux,4);
        is.ignore('#');
        anio = atoi(aux);
        fh.setAnio(anio);

        cout << "\n" << anio << endl;

        while(is.getline(c,1024,'#')){

            fh.aniadeEventoHistorico(c);

        }    
    }
    return is;    
}

FechaHistorica由以下人员组成: int n; 字符串数组

2 个答案:

答案 0 :(得分:0)

这种功能怎么样:

string test="1918#Stella Maris#Mickey#Shifting Sands";
vector<string> buffer;

size_t found = 0;
while ( found <= test.size() ){
    found = test.find('#')
    buffer.push_back(test.substr(0, found) );
    test.erase(test.begin(), test.begin()+(found+1) );
}

它返回像buffer = [1918,Stella Maris,....]这样的矢量,以及txt读数

ifstream f( path );
string line;

while (getline (f,line) ){
    // goes line by line, return line as string
}

f.close()

答案 1 :(得分:0)

在您的代码中is.ignore('#');是错误的。见here。所以使用如下

if (iss.peek() == '#') {
    iss.ignore();
}

最后while(is.getline(c,1024,'#')){将不会在文件结束前结束。所以我想,你首先阅读整行,然后像下面那样处理它。

string line;
while(getline(is, line)){

    istringstream iss(line);
    char  c[1024];
    char  aux[4];

    iss.read(aux,4);
    if (iss.peek() == '#') {
        iss.ignore();
    }
    anio = atoi(aux);
    fh.setAnio(anio);
    cout << "\n" << anio << endl;

    while(iss.getline(c,1024,'#')){
        cout << c << endl;
    }
}