问题istream :: tellg()?

时间:2010-09-10 03:52:28

标签: c++

我正在阅读data.txt:

//////////////////////////////////////////////////

data.txt:

//////////////////////////////////////////////////

MissionImpossible3
3
TomCruise
MaggieQ
JeffChase

这是代码:

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

int main() {
 ifstream fin("data.txt");
 string FilmName, ActorName;
 getline(fin,FilmName,'\n');
 cout << FilmName << endl;
//    cout << fin.tellg() << endl; //if I add this line to
// get current reading position of data.txt, the program just
// can't work as if tellg() triggered some error. So I removed
// all tellg(). What's the reason for this and what shall I do
// if I want to get current reading position?
 int a;
 fin >> a;
 cout << a << endl;
// cout << fin.tellg() << endl;
 getline(fin,ActorName,'\n');
// cout << fin.tellg() << endl;
    for(int i=0;i<a;i++)
    {
     getline(fin,ActorName,'\n');
     cout << ActorName << endl;
//     cout << fin.tellg() << endl;
    }

 getchar();
}

意外的输出是:

  


MissionImpossible3
24
0
-1
-1

我正在使用Dev-c ++和Windows XP。如果你们试一试并粘贴你的结果和环境,我将不胜感激。也许我的系统或编译器存在一些问题。

输入/输出的另一个版本:

data.txt中:

MissionImpossible3
3
TomCruise
MaggieQ
JeffChase

WarOfTheWorlds
2
TomCruise
DakotaFanning

SharkTale
3
JackBlack
RobertDeNiro
WillSmith

HideAndSeek
2
DakotaFanning
RobertDeNiro

TheAdventureOfPlutoNash
2
WillSmith
EddieMurphy

ShowTime
2
RobertDeNiro
EddieMurphy

输出:

MissionImpossible3
49
0
-1
-1

4 个答案:

答案 0 :(得分:2)

它表示在第一行之后消耗了24个字符,然后未能获得数字。但是,MissionImpossible3只有18个字符。

我怀疑你的线路编码不兼容。您的文件以\n结尾保存,而Windows iostream则需要\r\n。由于系统需要3,输入中的\n会被丢弃。然后下一个输入是非数字的,它进入错误状态。

尝试将输入数据复制粘贴到记事本中的新文件中。

答案 1 :(得分:2)

尝试以二进制模式打开文件:

ifstream fin("data.txt", ios::binary);

答案 2 :(得分:1)

用std :: ios :: binary创建ifstream修复了tellg,所以它在我的代码中返回了文件中的正确位置(Win 7 64位)。 正如L.Lawliets所问 - 为什么??!

答案 3 :(得分:0)

我编译并运行了重新启用tellg行的代码,它似乎工作正常。我得到的输出是:

MissionImpossible3
20个
3
21个
23个
汤姆·克鲁斯
34个
MaggieQ
43个
JeffChase
52

当您尝试运行时,您获得了哪些完全结果? [是的,这实际上更多的是评论而不是答案,但它不适合评论。]