字符串输出到文件

String Output to File

本文关键字:文件 输出 字符串      更新时间:2023-10-16

所以我试图写一个大字符串到。txt文件,但我有一些麻烦。我想输出的字符串是这样的:

0. x.y.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.1.x.y.t.x.y.t.x.y.t.2.x.y.t.s.x.y.t.s.x.y.t.s.x.y.t.s.3.x.y.t.x.y.t.4.n.name.t.f.m.i.x.y.t.x.y.t.x.y.t.x.y.t.n.name.t.f.m.i.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.n.name.t.f.m.i.x.y.t.x.y.t.x.y.t.x.y.t.n.name.t.f.m.i.x.y.t.x.y.t.x.y.t.5。

(这是一种数据保存格式,不值得深入研究)。

为了测试这个,我首先写了这个(其中chunk是上面的字符串,在函数之外创建,我想输出):

void WriteToFile(std::string chunk)
{
    cout << "Writing...n";
    ofstream SaveGame;
    SaveGame.open("SaveGame.txt");
    std::string MainString = "0.x.y.t.f.t.f.t.f.t.f.";
    cout << MainString;
    SaveGame << MainString;
    cout << "Done!n";
}

这个测试代码运行良好,并且我的输出文件包含0.x.y.t.f.t.f.t.f.t.f.

但是当我尝试这个时:

void WriteToFile(std::string chunk)
{
    cout << "Writing...n";
    ofstream SaveGame;
    SaveGame.open("SaveGame.txt");
    std::string MainString = chunk;
    cout << MainString;
    SaveGame << MainString;
    cout << "Done!n";
}

我得到胡言乱语:

⸰⹸⹹⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⸱⹸⹹⹴⹸⹹⹴⹸⹹⹴⸲⹸⹹⹴⹳⹸⹹⹴⹳⹸⹹⹴⹳⹸⹹⹴⹳⸳⹸⹹⹴⹸⹹⹴⸴⹎慮敭琮昮洮䤮砮礮琮砮礮琮砮礮琮砮礮琮丮渮浡⹥⹴⹦⹭⹉⹸⹹⹴⹸⹹⹴⹸⹹⹴⹸⹹⹴⹎慮敭琮昮洮䤮砮礮琮砮礮琮砮礮琮砮礮琮丮渮浡⹥⹴⹦⹭⹉⹸⹹⹴⹸⹹⹴⹸⹹⹴⹸⹹⹴⸵

不用说,这不是我想要的。

这是程序的完整代码;注意,无论我使用WriteToFile(Chunk)还是WriteToFile(Total),它都会失败。如果我将MainString初始化为WriteToFile中的整个字符串,代码也会失败。

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
void ReadFile();
void WriteToFile(std::string chunk);
int main()
{
    ///CHUNK SAVE FORMAT
    std::string Chunk = "0.";
    Chunk += "x.y.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "1.";
    Chunk += "x.y.t.";
    Chunk += "x.y.t.";
    Chunk += "x.y.t.";
    Chunk += "2.";
    Chunk += "x.y.t.s.";
    Chunk += "x.y.t.s.";
    Chunk += "x.y.t.s.";
    Chunk += "x.y.t.s.";
    Chunk += "3.";
    Chunk += "x.y.t.";
    Chunk += "x.y.t.";
    Chunk += "4.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.";
    Chunk += "5.";
    std::string Total = "0.x.y.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.1.x.y.t.x.y.t.x.y.t.2.x.y.t.s.x.y.t.s.x.y.t.s.x.y.t.s.3.x.y.t.x.y.t.4.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.5.";
    WriteToFile(Total);
    return 0;
}
void ReadFile()
{
}
void WriteToFile(std::string chunk)
{
    cout << "Writing...n";
    ofstream SaveGame;
    SaveGame.open("SaveGame.txt");
    std::string MainString = chunk;
    cout << MainString;
    SaveGame << MainString;
    cout << "Done!n";
}

这是怎么回事?

即使没有尝试过,我也可以自信地说它对我有效。错误不在代码中,而是在其他地方:

我怀疑你是在Windows的记事本或类似的程序中打开文本文件的。应用程序将尝试猜测文件的编码,并(错误地)猜测它是unicode编码的文件(UTF-16)。

要解决这个问题,请在打开文件时指定编码(如果Notepad不支持此编码,请使用适当的文本编辑器,例如notepad++)。

'gibberish'是正确的数据,但被解释为16位unicode字符。请看方格中的十六进制小数字:

是0x2E和0x30('。'和'0')

我猜你写的文件是正确的,但不知怎的,检查你写的数据的方式是错误的。

您是否碰巧使用记事本打开文件?如果是这样,如果没有BOM, notepad将使用一些启发式方法(IsTextUnicode)来猜测文件内容的编码。在你的情况下,特定的内容使它认为它实际上是Unicode…

你的代码工作正常。是记事本坏了。阅读更多关于记事本编码问题的信息。

您提供的代码在使用g++ (Ubuntu/Linaro 4.5.2-8ubuntu4)编译时可以正常工作诊断问题需要有关环境的信息。

澄清一下,当您查看文件时,错误的代码是否会向终端回显乱码?

我怀疑你的函数实际上是生成你想要的位,但他们碰巧欺骗一些东西认为文件是unicode而不是ascii。

似乎编码有一些问题。尝试在编辑器中打开文件而不是记事本(wordpad或notepad++),您也将在读取相同的文件时获得正确的结果。