当从文件中读取时,tellg()的行为如何?

时间:2015-05-30 12:51:29

标签: c++ fstream

我正在尝试使用<table> <tr> <td><b> Question 1. </b> Match List-I with List-II and select the correct answer using the code given below the lists :</td> </tr> <tr> <td> <table class="tab_ques"> <tr> <td>List-I (Town) </td> <td>List-II( River Nearer to it)</td> </tr> <tr> <td>A. Betul</td> <td>1. Indravati</td> </tr> <tr> <td>B. Jagdalpur</td> <td>2.Narmada</td> </tr> <tr> <td>C. Jabalpur</td> <td>3.Shipra</td> </tr> <tr> <td>D. Ujjain</td> <td>4.Tapti</td> </tr> </table> </td> </tr> <tr> <td> <table class="tab_opt"> <tr> <td>&nbsp;</td> <td>A</td> <td>B</td> <td>C</td> <td>D</td> </tr> <tr> <td> a. </td> <td> 1 </td> <td> 4 </td> <td> 2 </td> <td> 3 </td> </tr> <tr> <td> b. </td> <td> 4 </td> <td> 1 </td> <td> 2 </td> <td> 3 </td> </tr> <tr> <td> c. </td> <td> 1 </td> <td> 4 </td> <td> 3 </td> <td> 2 </td> </tr> <tr> <td> d. </td> <td> 4 </td> <td> 1 </td> <td> 3 </td> <td> 2 </td> </tr> </table> </td> </tr> <tr> <td><a href="ans_nobelprize_p1.html">Answer</a></td> </tr> <tr> <td><b> Question 2. </b> Consider the following statement : </td> </tr> <tr> <td>1.The nation-wide scheme of the National Child Labour Projects (NCLP) is run Union Ministry of Social Justice amd Empowerment.<br> 2.Gurupadswamy Committee dealt with the issue of child labour. </td> </tr> <tr> <td>Which of the statements given above is/are correct?</td> </tr> <tr> <td> <table> <tr> <th> a. </th> <td> 1 only </td> </tr> <tr> <th> b. </th> <td> 2 only </td> </tr> <tr> <th> c. </th> <td> Both 1 and 2 </td> </tr> <tr> <th> d. </th> <td> Neither 1 nor 2</td> </tr> </table> </td> </tr> </table> 从文件中读取。我正在尝试的文件 阅读有这个内容:

fstream

我的代码:

1200
1000
980
890
760

输出结果为:

#include <fstream>
#include <iostream>

using namespace std;

int main ()
{
    fstream file("highscores.txt", ios::in | ios::out);

    if (!file.is_open())
    {
        cout << "Could not open file!" << endl;
        return 0;
    }

    int cur_score; 

    while (!file.eof())
    {
        file >> cur_score;
        cout << file.tellg() << endl;
    }
}

为什么在第一次阅读9 14 18 22 26 后返回9, 第一个读数是数字(1200),即4个位置 我知道有tellg()\r所以这就是6个职位。也。如果我在我的文件中添加更多号码\n将会 首次阅读后返回更大的数字。

1 个答案:

答案 0 :(得分:2)

如果您使用文本编辑器以UTF8格式保存文件,则文件开头可能会有UTF8 BOM。这个BOM是3个字符长,所以添加到6,它会使9。

如果您想确定,请查看文件的开头,并使用:

fstream file("highscores.txt", ios::in | ios::out | ios::binary);
if(file) {
    char verify[16];
    file.read(verify, sizeof(verify));
    int rd = file.gcount();
    for(int i = 0; i<rd; i++) {
        cout << hex << setw(2) << (int)verify[i] << " ";
    }
    cout <<dec << endl;
}

修改

在文件上运行带有MSVC2013的窗口,我发现了预期的4,10,15,20,25,我无法重现您的数据。

我现在用mingw做了一个测试,在这里我得到了你的数字,增加行数的奇怪效果增加了输出。

当您在文本模式下阅读Windows(CRLF行分隔符)文件时,这是MINGW的错误

  • 如果我以UNIX风格保存文件(即LF行分隔符),我会得到相同的程序4,9,13,17,这也是linux系统的预期值。

  • 如果我以WINDOWS样式保存文件(即CRLF行分隔符),如果我更改代码以在ios::binary中打开文件,我就会得到等待的4,10,15,20, 25。

显然它是old problem