std :: fstream :: tellg()错误地输出文件光标指针?

时间:2017-04-04 12:45:14

标签: c++ fstream

我有std::fstream,我使用

导入
std::fstream myFile { "C:/path/to/file.txt" };

当我想读取第一个字节时,我使用

char c;
cout << myFile.tellg() << endl; // Correctly outputs 0 (begining of file)
myFile.read(&c, 1);
cout << myFile.tellg() << endl; // Should output 1, but it outputs
                                // FFFFFFFFFFFFFFFA
myFile.read(&c, 1);
cout << myFile.tellg() << endl; // Should output 2, but it outputs
                                // FFFFFFFFFFFFFFFB

这里发生了什么?

我尝试了

midi_file.seekg(0, ios_base::beg);

midi_file.seekg(0, myFile.beg);

但每当我尝试读取一个字节时,光标就会移动到FFFFFFFFFFFFFFFA

修改

我不知道它是否有事可做,但我做了一个字节序测试,这些都是结果:

bool endianness = *reinterpret_cast<short*>("10") & 1; // Outputs 1

编辑2:

文件坏了,因为输出与另一个文件不一样,但为什么呢?

以下是来自HxD的文件中的字节数据,它是.midi文件:

4D 54 68 64 00 00 00 06 00 01 00 03 00 04 4D 54
72 6B 00 00 00 A1 00 C0 69 00 90 3C 5A 01 41 5A
01 45 5A 01 48 5A 01 49 5A 01 48 5A 01 45 5A 01
41 5A 01 3C 5A 01 37 5A 01 33 5A 01 30 5A 01 30 
5A 01 30 5A 01 33 5A 01 37 5A 01 3C 5A 01 41 5A 
01 45 5A 01 48 5A 01 49 5A 01 48 5A 01 45 5A 01 
41 5A 01 3C 5A 01 37 5A 01 33 5A 01 30 5A 01 30 
5A 01 30 5A 01 33 5A 01 37 5A 01 3C 5A 01 41 5A 
01 45 5A 01 48 5A 01 49 5A 01 48 5A 01 45 5A 01 
41 5A 01 3C 5A 01 37 5A 01 33 5A 01 30 5A 01 30 
5A 01 30 5A 01 33 5A 01 37 5A 01 3C 5A 01 41 5A 
01 45 00 00 FF 2F 00 4D 54 72 6B 00 00 00 41 00 
C1 72 05 91 3C 5A 00 40 5A 00 43 5A 00 48 5A 0A 
35 5A 00 41 5A 00 44 5A 00 49 5A 0A 37 5A 00 40 
5A 00 43 5A 00 48 5A 0A 41 5A 00 47 5A 0A 30 5A 
00 40 5A 00 43 5A 00 48 5A 05 32 00 00 FF 2F 00 
4D 54 72 6B 00 00 00 26 00 C2 47 0A 92 50 64 01 
52 64 09 50 78 00 52 78 0A 50 00 01 52 00 09 50 
78 01 50 00 0A 52 00 00 50 00 00 FF 2F 00

编辑3:

以下是此测试的完整代码:

#include <fstream>
#include <iostream>

int main() {
    cout << std::hex << std::setfill('0') << std::uppercase;

    fstream midi_file{ "D:/Descargas/OutFile.midi" };

    cout << midi_file.good() << endl; // Outputs 1

    char c;
    cout << midi_file.tellg() << endl; // Correctly outputs 0 (begining of file)
    midi_file.read(&c, 1);
    cout << midi_file.tellg() << endl; // Erroneously outputs FFFFFFFFFFFFFFFA
    midi_file.read(&c, 1);
    cout << midi_file.tellg() << endl; // Erroneously outputs FFFFFFFFFFFFFFFB

    // Endianness test:
    cout << (*reinterpret_cast<short*>("10") & 1) << endl; // Outputs 1

    return 0;
}

2 个答案:

答案 0 :(得分:1)

tellg的返回值为 NOT 一个数字。它是一个pos_type,它有一些需要遵循的规则,但是当打印不是其中之一时可以理解。见http://en.cppreference.com/w/cpp/io/fpos

它的主要目的是允许搜索操作返回到保存位置。

此外,您的“字节顺序测试”非常非常混乱。将字符串重新解释为short? C不起作用。如果您使用过"\x01\x00"

,则可能

答案 1 :(得分:0)

文件打开模式必须处于ios::binary模式,才能捕获特殊字符。