我写了一个简短的程序来生成均匀间隔的随机数字并将其保存到通用文本文件中。如果我要求它精确地生成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;
}
答案 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)