在使用 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,所以任何帮助将非常感激。
以防万一有人再次遇到同样特殊的失败/成功条件,问题是我在同一个 fstream 上调用了两次 open 。 open 似乎成功了,但 getline 不会运行,因为设置了流的失败位。谢谢伊戈尔。
这很有帮助。我遇到了类似的问题。必须关闭我写入的文件,然后用“r”(读取)重新打开它,以便将文本复制到另一个文件中。