字符串输出到文件

时间:2011-09-28 08:11:12

标签: c++ string file-io

所以我正在尝试将一个大字符串写入.txt文件,但是遇到了一些麻烦。我要输出的字符串是:

  

0.xytftftftftftftftftft.ftftftftftftftftftftf.tftftftftftftftftftft.ftftftftftftftftftftf.tftftftftftftftftftft.ftftftftftftftftftftf.tftf1.xytxytxyt2.xytsxytsxytsxyts3.xytxyt4.N.name.tfmIxytxytxytxytNname.tfmIxytxytxytxytxytxy.tNname.tfmIxytxytxytxytNname.tfmIxytxytxyt5

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

为了尝试测试这个,我首先写了这个(其中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";
}

这里发生了什么?

5 个答案:

答案 0 :(得分:4)

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

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

要解决此问题,请在打开文件时指定编码(如果记事本不支持此操作,请使用正确的文本编辑器,例如Notepad ++)。

答案 1 :(得分:4)

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

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

我的猜测是你正在正确地写文件,但不知何故以错误的方式检查你的书面数据。

答案 2 :(得分:2)

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

您的代码运行正常。这是破碎的记事本。阅读有关记事本编码问题here的更多信息。

答案 3 :(得分:0)

使用g ++编译时,您呈现的代码按预期工作(Ubuntu / Linaro 4.5.2-8ubuntu4) 诊断问题需要有关您环境的信息。

澄清一下,行为不端的代码是否会对终端以及查看文件时发出乱码?

我怀疑你的函数实际上是在生成你想要的位,但它们碰巧会认为文件是unicode而不是ascii。

答案 4 :(得分:0)

编码似乎存在一些问题。尝试在记事本(wordpad或notepad ++)以外的编辑器中打开文件,也可以在读取同一文件时获得正确的结果。