将字符串输出到文件

3

我正在尝试将一个较大的字符串写入.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.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.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";
}

我看到一些乱码:
Sorry, I am unable to translate the given text as it seems to be a string of random characters and symbols with no clear meaning or context. Please provide me with a valid text in Chinese that needs to be translated.
不用说,这不是我想要的。下面是程序的全部代码;请注意,无论我是使用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";
}

这里发生了什么?

我尝试了你在问题结尾写的完整程序,输出结果都正常,无论是屏幕上还是文件里。你能够粘贴一下产生错误输出的“确切源代码”吗? - Giorgio
我无法使用你的源代码得到相同的结果。它本来可以正常工作的。 - Jordonias
结果证明,问题出在记事本试图将文件内容读取为Unicode而不是ASCII(请参见下面有用的答案!)。就像我来自的地方所说的那样,今天我会少学一点然后去睡觉! - GarrickW
5个回答

4

即使我没有实际尝试过,但我仍然可以自信地说这对我有效。错误不在代码中而是其他地方:

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

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


啊,是的,我正在使用记事本。谢谢!很高兴知道这不是代码的问题!使用WordPad而不是NotePad可以显示正确的信息。 - GarrickW
出于好奇,为什么记事本将较长的字符串解释为Unicode,但是较短的字符串则正确地解释为ASCII? - GarrickW
@GarrickW:这是由于记事本使用的启发式算法的原因。这有点复杂,但Wikipedia文章对此进行了解释。还可以查看该文章中的外部链接,特别是Raymond Chen提供的更技术性的解释。 - Konrad Rudolph
有趣的链接。我想我在其他答案中也看到了它们... :) - Eran

4
“乱码”实际上是正确的数据,但被解释成16位unicode字符。请看方框中的小十六进制数字:
⸰ 是 0x2E 和 0x30('.'和'0')
我猜你写文件是正确的,但以某种错误的方式检查了你写的数据。

2

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

你的代码运行良好。是记事本出了问题。更多关于记事本编码问题的信息,请点击此处


+1:关于记事本的问题。当我听到“启发式算法”这个词时,我就会拿起我的左轮手枪 :-) - Roddy
1
@Roddy,这提供了一些短暂的乐趣,带有“布什隐藏事实”的风格笑话... :) - Eran

0

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

为了澄清,出现问题的代码是否在终端和查看文件时都会输出无意义的字符?

我怀疑您的函数实际上正在生成所需的位,但它们恰好欺骗了某些东西,使其认为该文件是Unicode而不是ASCII。


0

编码似乎存在一些问题。尝试在除记事本(如Wordpad或Notepad++)之外的编辑器中打开文件,同时读取同一文件后您将获得正确的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接