如何读取文件末尾的第6个字符 - ifstream?

Aqu*_*irl 0 c++ file-io ifstream

void maintainFileName ()
{
    std :: ifstream myfile;
    myfile.open ("zoomLevels.txt");

    if (myfile.is_open ())
    {
        // Move to end of the file, 
        myfile.seekg (0, std::ios::end);

        // and then six characters back to pick up the last file number.
        myfile.seekg (6, std::ios::beg);

        int len = 1;
        char *t = new char[len];

        myfile.read(t, len);
        qDebug () << "\nt: " << *t << "\n";
    }
    else
    {
        qDebug () << "\nsorry";
    }
}
Run Code Online (Sandbox Code Playgroud)

该文件包含:

78.8115,29.582,1,01.rda
78.8115,29.582,2,02.rda
76.3671,30.2201,1,11.rda
76.3671,30.2201,2,12.rda
78.1908,30.3007,1,01.rda
78.1908,30.3007,2,02.rda
77.3284,29.1415,1,01.rda
77.3284,29.1415,2,02.rda
77.3064,29.1655,1,01.rda
77.3064,29.1655,2,02.rda
Run Code Online (Sandbox Code Playgroud)

该函数返回的值是5,而结尾的第六个字符是0!
我哪里错了?

Jam*_*nze 6

寻找文本文件中的任意位置是未定义的行为.在实践中,它可能会在各种Unices下工作,但在其他任何地方都没有.如果以二进制模式打开文件,则搜索是合法的.形式上,如果以二进制模式打开文件,最后可能会得到额外的nul字节,但实际上,这在今天不是问题.但是,如果以二进制模式打开它,您可能会看到其他内容而不是 '\n'数据; 例如,在Windows下,您将看到两个字符序列0x0D, 0x0A.

当然,在您的代码中,您从一开始就寻求,而不是从最终开始.这也是未定义的行为,但大多数情况下,只要您在第一行搜索,它就会起作用.

最后,你所展示的数据中最后的第六个字符是a '2',而不是a '0',就像你写的那样.但是,当然,在Unix以外的系统上,您可以轻松地看到其他内容(或者出现错误):可能是 '.'Windows下,或者' '某个大型机操作系统下的错误(或者可能是' ).