ifstream tellg()没有返回正确的位置

时间:2012-09-03 17:37:28

标签: c++ file fstream

代码如下:

守则:

#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;
}

文件内容:

1800567
Ho Rui Jang
21
Female
Malaysian
012-4998192
20 , Lorong 13 , Taman Patani Janam
Melaka
Sungai Dulong

问题:

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

3 个答案:

答案 0 :(得分:5)

这看起来更像是编译器错误(可能是gcc)

使用以下代码: -

#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;
}

以下是输出: -

Bug

图片inpstr.exe来自Visual studio's clinp.exe来自g++(gcc version 4.6.1 (tdm-1))

答案 1 :(得分:5)

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

       <ListPreference
        android:title="@string/notifications_feed_url"
        android:key="feed_url"
        android:entries="@array/rssNames"
        android:entryValues="@array/rssFeeds"
        android:defaultValue="News"/>

它对我有帮助

答案 2 :(得分:0)

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

实际上,在unix下,tellg()确实会从文件的开头返回一个偏移量。在Windows下,它会从文件开头返回一个偏移量,但仅在文件以二进制模式打开时才会返回。

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