std :: fstream的惊人结果

时间:2018-11-03 04:41:02

标签: c++ visual-c++ text io fstream

我写了一个简短的程序来生成均匀间隔的随机数字并将其保存到通用文本文件中。如果我要求它精确地生成786432位数字(每六位空格),则输出将显示为随机的中文和日语字符。为什么? 我将标准库类用于文件I / O和64位Xorshift作为PRNG。

程序(在MSVC下编译):

#include <iostream>
#include <fstream>
#include <algorithm>

// From https://en.wikipedia.org/wiki/Xorshift
uint64_t xorsh64star(uint64_t* state)
{
    uint64_t x = *state;
    x ^= x >> 12;
    x ^= x << 25;
    x ^= x >> 27;
    state[0] = x;
    return x * 0x2545F4914F6CDD1D;
}

int main()
{
    uint64_t nDigits = 0;
    uint64_t wordLen = 1;
    std::cout << "How many digits?\n";
    std::cin >> nDigits;
    std::cout << "How many digits/word?\n";
    std::cin >> wordLen;
    std::fstream* txt = new std::fstream("randTxt.txt", std::ios::out);
    std::cout << "writing...";
    uint64_t charCtr = 0;
    uint64_t xorshState = 1103515245U; // GLIB C init constant, from https://www.shadertoy.com/view/XlXcW4
    for (uint64_t i = 0; i < nDigits; i += 1)
    {
        uint64_t rnd = xorsh64star(&xorshState) % uint64_t(9);
        *txt << rnd;
        charCtr += 1;
        if (!(charCtr % wordLen) && charCtr != 1)
        {
            *txt << ' ';
            charCtr += 1;
        }
    }
    std::cout << "finished! :D";
    return 0;
}

具有786431位数字的输出: 786431 digits, six digits/space

具有786432位数字的输出: 786432 digits, six digits/space

具有786433位数字的输出: 786433 digits, six digits/space

2 个答案:

答案 0 :(得分:1)

以下答案很有帮助,但实际上并未纠正报告的问题。仅在Windows notepad.exe编辑器中看到此问题。它在非常特定的实例中错误地显示了文件。无论如何,我希望有人认为以下答案有用。


使用new创建文件流看起来很不寻常,在此代码中不是必需的。这样做还意味着您需要使用delete来正确刷新,关闭和销毁流对象。

替换此:

std::fstream* txt = new std::fstream("randTxt.txt", std::ios::out);

具有:

std::fstream txt("randTxt.txt", std::ios::out);

您的文章将如下所示:

txt << rnd;

当流对象超出范围时,它将很好地关闭文件并释放其持有的所有资源。

答案 1 :(得分:1)

这是解决方法。我不确定是什么原因导致了原始问题,但是一旦if语句更改为:

if (!(charCtr % wordLen) && charCtr != 1
{
    txt << ' ';
//  charCtr += 1;    // This makes each word after the first 1 digit shorter.
}

现在可以正确显示最终的.txt文件,它可以解决您的记事本查看问题 ,并且您所有单词现在都有6位数字,而不仅仅是第一个数字。

enter image description here

最初,我通过在Win 10 64位上使用MSVS17编译您的代码来重现相同的问题:

enter image description here