用ifstream::getline()碰到的很奇怪的现象

trancebaby 2002-12-02 12:11:05
我用的是c++builder5
用std::ifstream的时候,打开了一个文件,用getline()读取的时候,如果缓冲区设的比较小,一行还没有读完的时候,下一次读的时候,读的结果会一直是个空行。。。
觉得不应该是这样子。。。会不会是个bug?正常情况下应该是什么样的?

高手指点~~
code:
...
for (int i=0;i<100;i++)
{
inputFile.getline(aoBuffer,50);
if (strlen(aoBuffer)!=0)
{
Memo1->Lines->Add(AnsiString(aoBuffer));
}
if (inputFile.eof())
{
break;
}
}
...
用for是因为如果有这个情况发生。。。while会死循环..
...全文
576 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dirk 2002-12-26
  • 打赏
  • 举报
回复
Sorry, fangrk(加把油,伙计!) 所说的getline是标准的东西。
以下代码是我回复另外一个帖子的,但我觉得对你有帮助。

希望对你用帮助:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(int argc, char* argv[])
{
string strLine;
cout << "Please input a string --> " << endl;
getline(cin, strLine, cin.widen('\n'));
reverse(strLine.begin(), strLine.end());
cout << strLine.c_str() << endl;
return 0;
}

1、串长度没有关系;
2、代码量小;

问题:
1、在VC下需要在输入串后,回车两次,我还没有找到原因。在Dev C++没有问题。

trancebaby 2002-12-11
  • 打赏
  • 举报
回复
嗯,应该是标准的。。
string::getline (STL Sample)
The sample code below illustrates how to use the string::getline STL function in Visual C++.

Required Header:
<string>

Prototype:


template<class _E, class _TYPE, class _A> inline
basic_istream<_E, _TYPE>& getline( basic_istream<_E, _TYPE>& Istream,
basic_string<_E, _TYPE, _A>& Xstring,
const _E _D=_TYPE::newline());
trancebaby 2002-12-11
  • 打赏
  • 举报
回复
我现在想知道的是如何做错误处理。。。

>>fangrk(加把油,伙计!) 所使用的并不像是标准C++,
我在msdn里能够查到这个函数
getline
template<class E, class T, class A>
basic_istream<E, T>& getline(
basic_istream <E, T>& is,
basic_string<E, T, A>& str);
template<class E, class T, class A>
basic_istream<E, T>& getline(
basic_istream <E, T>& is,
basic_string<E, T, A>& str,
E delim);
但是在bcb的帮助里查不到这个。。
不过觉得应该是标准里的

>>只不过,你的buffer变量有问题
那么我怎么改进比较好呢?我原来只是用字符数组。。
Dirk 2002-12-11
  • 打赏
  • 举报
回复
我觉得问题可能在于你的aoBuffer的长度超过了你文件中的行的长度,因为你在调用getline的时候,没有指定结束字符,所以,默认是回车符,如果你的文件中内容行的长度超过你给定的aoBuffer长度,这里你设的是50,这种情况下,stream对象会罢工。

另外,你第一篇的代码中使用的是标准C++,是推荐的方式,而fangrk(加把油,伙计!) 所使用的并不像是标准C++,我觉得还是应该使用你的方式,只不过,你的buffer变量有问题。
sandrowjw 2002-12-04
  • 打赏
  • 举报
回复
是出错后设定了failbit,然后这个stream就罢工了,一定要手动把failbit清掉才可以,具体可以用标志函数来处理的,函数名字我忘了,我也是新学。
trancebaby 2002-12-04
  • 打赏
  • 举报
回复
fangrk(加把油,伙计!) :
太好了。。想多给点分。。。开始设得太少了。。。可以加分么,不能只好等下次了。。。

那么如果出现了上面的这种错误,要用什么来判断呢?
是用
iostate rdstate() const;
bool fail() const;
bool bad() const;
这三个中的哪一个阿?看帮助对这三个的区别不是很清楚。。。
fangrk 2002-12-04
  • 打赏
  • 举报
回复
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream input("c:\\test.txt");
string str;
while(getline(input,str)){//读一行内容到str,文本结束会导致循环结束
...//对读取的一行操作
}
return 0;
}

不要去限制什么字符长度
trancebaby 2002-12-04
  • 打赏
  • 举报
回复
这种情况不是应该抛出异常么?
我看basic_ifstream的例子程序都有。。

catch( ios_base::failure& var )
{
cout << var.what();
}
darkay 2002-12-03
  • 打赏
  • 举报
回复
补充:当流处于fail状态,所以流操作都立刻返回而且不修改流状态
darkay 2002-12-03
  • 打赏
  • 举报
回复
我估计不是你说的原因,应该是getline之后流的状态处于fail状态了,处于这个状态表示下一个流操作将失败,你要判断这个fail状态是否正常(the function extracts no elements or _Count - 1 elements),然后对于正常的情况调用clear复位流状态才行。
fat_horse 2002-12-03
  • 打赏
  • 举报
回复
试试inputFile.flush()或inputFile.clear()

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧