C++ getline 失败并显示“成功”:-(

问题描述 投票:0回答:2

在使用 Java 十年后,我又回到了 C++,这已经让我等了两周了。我看过很多有关 getline 问题的帖子,这些帖子导致我添加了许多“cout”,试图找出到底出了什么问题。我已经发现了 bad、fail 和 eof 位,但仍然有同样的问题。 getline 不会填充字符串或进入 while 循环。 不知道这是否重要,但我正在 Win7 PC 上使用 netbeans 进行编码,并在 rasberry pi 上编译/运行(运行 raspbian(我认为是 Debian))。

我想做的就是使用 getline 读取一个简单的文本文件!应该是基本的('scuse双关语:-)) 我尝试过使用 Unix 和 ASCII 行结尾(0x0A 和 0x0D0A)创建文本文件 - 没有什么区别。我正在使用创建文本文件的相同用户 ID 运行该程序,因此没有权限问题。

Getline 设置失败位(仅...而不是 eof),但 perror 报告“成功”,而我在“工作”中没有得到任何数据。

这里是导致错误的大部分类 - 带有许多调试注释。 “theFile”只是一个fstream(因为在未来的版本中我可能想打开它进行输出)。但在这里,正如您从输出中看到的那样,我肯定是使用 ios::in 打开文件。 “问题”发生在 getValue 成员函数中的 getline 循环(从未进入)中。 我没有包含构造函数,但它只将一些标志设置为 false。调用者(MJAppl)只需调用 MJConfigFile::getValue( "log_dir", false )。

string MJConfigFile::getValue ( string in_key, bool in_restart ) {
    bool   found   = false ;
    string work    , ret   ;
    int    key_len = in_key.length() , loop_count = 0 ;
    //char   workbuf [ 200 ] ;

    cout << "MJConfigFile::getValue entry for key " << in_key << " \n" ;
    cout << "File name is " << getFName () << "\n" ;
    if ( in_restart || !openForInput ) {
        theFile . close () ;
        open ( false ) ;        
    }
    if ( theFile . is_open ()) {
        cout << "File " << fullFileName << " is open." << "\n";
    } else {
        perror ( "Error while opening file " ) ;
    }
    while ( getline ( theFile, work )) {
        if (loop_count++ > 5 ) return "Stopped \n" ;
        cout << "Line '" << work << "'\n";
        if ( in_key.compare ( work ) == 0 ) {
            ret = work.substr ( key_len + 1 ) ;
            break ;
        }
    }
    perror ( "Error reading file. " ) ;
    cout << "Line after loop '" << work << "'\n";
    if ( theFile.bad() | theFile.fail() | theFile.eof()) {
        if ( theFile . bad () ) cout << "Bad  file." << endl ;
        if ( theFile . fail() ) cout << "Fail file." << endl ;
        if ( theFile . eof () ) cout << "eof  file." << endl ;

    }
    return ret ;
}

void MJConfigFile::open () {
    this -> open ( false ) ;
}
void MJConfigFile::open ( bool in_for_output ) {    

    if ( in_for_output ) {
        theFile . open ( fullFileName.c_str (), ios::out ) ;
        if ( theFile . is_open ()) {
            openForOutput = true ;
            cout << "File is open for output. \n" ;
        }
    } else {
        theFile . open ( fullFileName.c_str (), ios::in ) ;
        if ( theFile . is_open ()) { 
            openForInput  = true ;
            cout << "File is open for input. \n" ;
        }
    }    
    if ( openForInput || openForOutput ) {
        exists   = true ;
    }
}

这是运行的示例输出:

    In default MJConfigFile constructor
    File is open for input.
    MJAppl.readConfigFile() entry.
    File is open for input.
    MJConfigFile::getValue entry for key log_dir
    File name is /mjmaint/MJApplCfg/MJApplCfg.cfg
    File /mjmaint/MJApplCfg/MJApplCfg.cfg is open.
    Error reading file. : Success
    Line after loop ''
    Fail file.
    logdir is
    0

这是一个示例输入文件:

    Aaaaaa
    Bbbbbb
    Cccccc

我正准备放弃并回到java,所以任何帮助将非常感激。

c++ getline
2个回答
0
投票

以防万一有人再次遇到同样特殊的失败/成功条件,问题是我在同一个 fstream 上调用了两次 open 。 open 似乎成功了,但 getline 不会运行,因为设置了流的失败位。谢谢伊戈尔。


0
投票

这很有帮助。我遇到了类似的问题。必须关闭我写入的文件,然后用“r”(读取)重新打开它,以便将文本复制到另一个文件中。

© www.soinside.com 2019 - 2024. All rights reserved.