9

读取.cpp

#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
    int id;
    char name[50];
    ifstream myfile("savingaccount.txt");  //open the file
    myfile >> id;
    cout << myfile.tellg(); //return 16? but not 7 or 8
    cout << id ;

    return 0;
}

储蓄账户.txt

1800567
何瑞张
21
女性
马来西亚人
012-4998192
20 , Lorong 13 , Taman Patani Janam
马六甲
双溪独龙

问题

我希望tellg()返回7或者8因为第一行1800567是 7 位数字,所以流指针应该放在这个数字之后和字符串之前"Ho Rui Jang",但是tellg()返回16。为什么会这样?

4

3 回答 3

8

有同样的问题。尝试读取文件流二进制文件:

    ifstream myfile("savingaccount.txt",ios::binary);

它对我有帮助

于 2016-08-31T13:41:36.180 回答
4

This seems more like a compiler bug (probably gcc)

With the following Code:-

#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
    int id;
    char name[50];
    ifstream myfile("savingaccount.txt");  //open the file
    cout << myfile.tellg()<<endl;
    myfile >> id;
    streamoff pos=myfile.tellg();
    cout <<"pos= "<<pos<<'\n';
    cout <<"id= " << id<<'\n' ;
    return 0;
}

Following is the output:-

Bug

In the image inpstr.exe was generated from Visual studio's cl while inp.exe from g++(gcc version 4.6.1 (tdm-1))

于 2012-09-03T18:10:12.980 回答
3

这不是编译器错误。 tellg()不保证从文件开头返回偏移量。有一组最小的保证,例如,如果返回值 fromtellg()被传递给seekg(),则文件指针将定位在文件中的对应点。

实际上,在 unix 下,tellg()确实返回文件开头的偏移量。在 Windows 下,它返回从文件开头的偏移量,但前提是文件以二进制模式打开。

但唯一真正的保证是返回的不同值tellg()将对应文件中的不同位置。

于 2016-08-31T13:53:48.453 回答