每个字节读取文件

时间:2011-03-18 20:47:43

标签: c++ fstream

我有一个简单的程序:

#include <cstring>
#include <fstream>

using namespace std;

int main(int argc, char **argv)
{
    cout << "Creating test.txt file..." << endl;

    // Writing to file
    fstream fWrite;
    fWrite.open("./_test_data/test.txt", fstream::out | fstream::trunc);
    if (fWrite.fail()) {
        cout << "Creating test.txt file failed!" << endl;
        fWrite.close();
    } else {
        fWrite << (char) 0x09 << (char) 0x0A << (char) 0x0B;
        fWrite << (char) 0x0C << (char) 0x0D << (char) 0x0E;
        fWrite << flush;

        fWrite.close();
        cout << "test.txt file successfully created." << endl;
    }

    // Reading created file
    cout << "Reading test.txt file..." << endl;
    fstream fRead;
    fRead.open("./_test_data/test.txt", fstream::in);
    if (fRead.fail()) {
        fRead.close();
    } else {
        char character;

        while (true) {
            fRead >> character;

            if (fRead.eof()) {
                cout << (int)character << endl;
                cout << "EOF detected!" << endl;
                break;
            }

            cout << (int)character << endl;
        }
        fRead.close();
    }

    return 0;
}

它应该按顺序09 0A 0B 0C 0D 0E写入字节,这样就可以了(通过hexdump检查),但是当读取同一个文件时,它会将第一个字节读作0E(=十进制的14)并且然后是EOF ......

Creating test.txt file...
test.txt file successfully created.
Reading test.txt file...
14
14
EOF detected!

为什么?

4 个答案:

答案 0 :(得分:4)

使用fRead.read(&character,1)代替fRead >> character

但您也可以删除if语句中的cout << (int)character << endl;

答案 1 :(得分:1)

以二进制模式打开文件:fRead.open("...", fstream::in | fstream::binary); - 这是为了防止文件层翻译换行序列。

答案 2 :(得分:0)

试试fRead >> std::noskipws。读取流上的>>运算符会跳过空格以获取下一个“有趣”数据。考虑像hi there这样的输入流。一次读取std::string,您将获得hithere,并忽略空格字符。 Simiarly,一次读到一个角色,你得到了-h-i-t-h-e-r-e-,忽略了空格。

你无法从fRead中读取的字节都被视为空格,因此它们都被忽略了。

fRead.read()是一个解决方案(也是一个好的解决方案)的原因是它没有格式化输入 - 它不关心空格。

最后,您应该对您的程序进行其他更改:

#include <iostream>  // you need this for std::cout and std::endl

iostreamstd::cout需要std::endl

fRead.open(“./_ test_data / test.txt”,fstream :: in | fstream :: binary);

如果要在其中包含任何不可打印的字符,则需要以二进制形式打开测试文件(用于写入和读取)。

答案 3 :(得分:-1)

尝试fstream::in | fstream::binary