C++ 字符串输出到文件

C++ 字符串输出到文件,c++,string,file-io,C++,String,File Io,因此,我试图将一个大字符串写入.txt文件,但遇到了一些问题。我要输出的字符串如下: t.f.t.f.t.f.t.t.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.t.t.f.t.t.f.t.f.t.t.f.t.t.t.t.t.t.t.t.f.f.t.f.f.t.t.f.t.t.t.t.t.f.t.t.t.t.t.t.t.t.f.t.t.t.t.t.f.t.t.t.t.t.t.t.t.t.f.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t

因此,我试图将一个大字符串写入.txt文件,但遇到了一些问题。我要输出的字符串如下:

t.f.t.f.t.f.t.t.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.t.t.f.t.t.f.t.f.t.t.f.t.t.t.t.t.t.t.t.f.f.t.f.f.t.t.f.t.t.t.t.t.f.t.t.t.t.t.t.t.t.f.t.t.t.t.t.f.t.t.t.t.t.t.t.t.t.f.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.f.f t.f.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.f.t.f.t.f.t.t.f.t.t.t.f.t.t.t.t.t.f.t.t.f.t.t.f.t.t.t.f.t.t.f.t.t.f.t.t.t.1.x.y.t.x.y.y.t.t.t.t.2.x.x.y.t.s.s.x.s.x.x.y.x.y.t.s.s.x.s.x.x.x.y.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.t.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.y.t.t.N.name.t.f.m.I.x.y.y.t.y.t.x.y.t.t.y.t.5

(这是一种数据保存格式,不值得使用)

为了测试这一点,我首先编写了以下代码(其中
chunk
是上述在函数外部创建的字符串,我希望输出该字符串):

我胡言乱语:

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

不用说,这不是我想要的

这是程序的完整代码;请注意,无论我使用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";
}
#包括
#包括
#包括
#包括
使用名称空间std;
void ReadFile();
void WriteToFile(std::string chunk);
int main()
{
///块存储格式
std::string Chunk=“0。”;
区块+=“x.y.”;
Chunk+=“t.f.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.t.f.”;
Chunk+=“t.f.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.t.f.”;
Chunk+=“t.f.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.t.f.”;
Chunk+=“t.f.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.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。”;
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.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.”;
区块+=“5。”;
std::字符串总数="t.f.t.f.t.f.t.t.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.t.t.f.t.t.f.t.f.t.t.f.t.t.t.t.t.t.t.t.f.f.t.f.f.t.t.f.t.t.t.t.t.f.t.t.t.t.t.t.t.t.f.t.t.t.t.t.f.t.t.t.t.t.t.t.t.t.f.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.f.f t.f.t.f.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.f.t.t.f.t.f.t.f.t.f.t.f.t.t.f.t.t.t.f.t.t.f.t.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.f.t.t.t.1.x.y.t.x.y.y.t.t.t.t.2.x.t.s.x.s.x.x.y.s.x.x.y.s.s.x.s.x.x.x.y.t.s.s。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.y.t.t.x.y.t.N.name.t.f.m.I.x.y.t.y.x.y.t.y.t.x.y.t.N.name.t.f.m.x.y.y.x.y.t.y.t.t.y.t.5.“;
写入文件(总计);
返回0;
}
void ReadFile()
{
}
void WriteToFile(std::string chunk)
{

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

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


要解决此问题,请在打开文件时指定编码(如果记事本不支持此功能,请使用适当的文本编辑器,如记事本++)。

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

⸰ 是0x2E和0x30(“.”和“0”)


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

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


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

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

要澄清的是,行为不端的代码是否会向终端发出胡言乱语的回音,以及您查看文件时的回音


我怀疑您的函数实际上正在生成所需的位,但它们碰巧欺骗了某些人,使他们认为该文件是unicode而不是ascii。

编码中似乎存在一些问题。请尝试在记事本(写字板或记事本++)以外的编辑器中打开该文件,阅读同一个文件时,你也会得到正确的结果。

+1:对于记事本捕获。当我听到“启发法”这个词时,我就伸手去拿我的左轮手枪:-)@Roddy,好吧,这给风格笑话带来了一些短暂的乐趣…:)我尝试了你在问题结束时编写的完整程序,输出正常,这两个n屏幕和文件。你能粘贴产生错误输出的“精确源代码”吗?我无法用你的源代码产生相同的结果。它工作正常。事实证明,记事本试图将文件内容读取为Unicode,而不是ASCII(请参阅下面的帮助答案!)。正如我们所说的我在哪里
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";
}
#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";
}