C++ C++;-string.compare输出到文本文件与控制台输出不同时的问题?

C++ C++;-string.compare输出到文本文件与控制台输出不同时的问题?,c++,string,compare,C++,String,Compare,为了进行单元测试,我试图找出我拥有的两个字符串是否相同。第一个是预定义的字符串,硬编码到程序中。第二个是使用std::getline()从带有ifstream的文本文件读入,然后作为子字符串。这两个值都存储为C++字符串。 当我使用cout将这两个字符串输出到控制台进行测试时,它们看起来都是相同的: 这是TestStringOutputedToaFile 这是TestStringOutputedToaFile 但是,string.compare返回的值表示它们不相等。输出到文本文件时,两个字符串

为了进行单元测试,我试图找出我拥有的两个字符串是否相同。第一个是预定义的字符串,硬编码到程序中。第二个是使用std::getline()从带有ifstream的文本文件读入,然后作为子字符串。这两个值都存储为C++字符串。 当我使用cout将这两个字符串输出到控制台进行测试时,它们看起来都是相同的:

这是TestStringOutputedToaFile 这是TestStringOutputedToaFile

但是,string.compare返回的值表示它们不相等。输出到文本文件时,两个字符串显示如下:

这是TestStringOutputedToaFile T^@h^@i^@s^@i^@s^@A^@T^@e^@s^@T^@s^@T^@r^@i^@n^@g^@O^@u^@T^@p^@u^@T^@ t^@e^@d^@t^@o^@A^@F^@i^@l^@e

我猜这是某种编码问题,如果我使用我的母语(很好的旧C),我不会有太多问题。事实上,我使用的是C/C++和Vi,坦率地说,我真的不知道从这里走到哪里!我尝试过从ansi/unicode转换到ansi/unicode,也尝试过删除这些奇怪的字符,但我甚至不确定它们是否真的存在

提前感谢您的建议

编辑 抱歉,这是我第一次在这里发帖。下面的代码是我如何完成这个过程的:

ifstream myInput;
ofstream myOutput;

myInput.open(fileLocation.c_str()); 
myOutput.open("test.txt");

TEST_ASSERT(myInput.is_open() == 1);

string compare1 = "ThisIsATestStringOutputtedToAFile";
string fileBuffer;

std::getline(myInput, fileBuffer);
string compare2 = fileBuffer.substr(400,100);

cout << compare1 + "\n";
cout << compare2 + "\n";
myOutput << compare1 + "\n";
myOutput << compare2 + "\n";
cin.get();

myInput.close();
myOutput.close();

TEST_ASSERT(compare1.compare(compare2) == 0);
ifstreammyinput;
流输出;
打开(fileLocation.c_str());
myOutput.open(“test.txt”);
TEST_ASSERT(myInput.is_open()==1);
string compare1=“ThisisTestStringOutputedToaFile”;
字符串文件缓冲区;
std::getline(myInput,fileBuffer);
字符串compare2=fileBuffer.substr(400100);

cout以下内容适用于我,并将下面粘贴的文本写入文件。请注意字符串中嵌入的
'\0'
字符

#include <iostream>
#include <fstream>
#include <sstream>

int main()
{
    std::istringstream myInput("0123456789ThisIsATestStringOutputtedToAFile\x0 12ou 9 21 3r8f8 reohb jfbhv jshdbv coerbgf vibdfjchbv jdfhbv jdfhbvg jhbdfejh vbfjdsb vjdfvb jfvfdhjs jfhbsd jkefhsv gjhvbdfsjh jdsfhb vjhdfbs vjhdsfg kbhjsadlj bckslASB VBAK VKLFB VLHBFDSL VHBDFSLHVGFDJSHBVG LFS1BDV LH1BJDFLV HBDSH VBLDFSHB VGLDFKHB KAPBLKFBSV LFHBV YBlkjb dflkvb sfvbsljbv sldb fvlfs1hbd vljkh1ykcvb skdfbv nkldsbf vsgdb lkjhbsgd lkdcfb vlkbsdc xlkvbxkclbklxcbv");
    std::ofstream myOutput("test.txt");
    //std::ostringstream myOutput;

    std::string str1 = "ThisIsATestStringOutputtedToAFile";
    std::string fileBuffer;

    std::getline(myInput, fileBuffer);
    std::string str2 = fileBuffer.substr(10,100);

    std::cout << str1 + "\n";
    std::cout << str2 + "\n";
    myOutput << str1 + "\n";
    myOutput << str2 + "\n";

    std::cout << str1.compare(str2) << '\n';

    //std::cout << myOutput.str() << '\n';
    return 0;
}
#包括
#包括
#包括
int main()
{
std::istringstream myInput("0123456789此为测试字符串输出到文件\x0 12ou 9 21 3r8f8 REOB jfbhv jshdbv coerbgf vibdfjchbv jdfhbv JHBDFFJH vbfjdsb vjdfvb jfvfdhjs jfhbsd jkefhsv gjhvbdfsjh jdsfhb VJHB VJHSADFG KbHJSADLJKSLASB VKLFB VKLFB VLHBFDSL VHBDFbFbFbFbFbFbFbFbFbFbFbFbFbFbG LFS1BDV LH1BfFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbLK1hbd vljkh1ykcvb skdfbv nkldsbf vsgdb lkjhbsgd lkdcfb vlkbsdc xlkvbxkclbklxcbv”);
std::流myOutput(“test.txt”);
//std::ostringstream输出;
std::string str1=“ThisisTestStringOutputedToaFile”;
字符串文件缓冲区;
std::getline(myInput,fileBuffer);
std::string str2=fileBuffer.substr(10100);

std::cout您是如何创建
myInput
的内容的?我猜此文件是以双字节编码创建的。您可以使用十六进制转储来验证此理论,或者使用其他编辑器来创建此文件

最简单的方法是启动cmd.exe并键入

echo "ThisIsATestStringOutputtedToAFile" > test.txt
更新:


如果您无法更改
myInput
文件的编码,您可以尝试在程序中使用宽字符。例如,使用
wstring
而不是
string
wifstream
而不是
ifstream
wofstream
wcout
,等等。

事实证明,问题在于文件编码错误MyPosits是UTF-16,而比较字符串是UTF-8。用这个项目的Linux操作系统(Linux,C/C++代码)来转换它们的方法是使用ICONVE()函数。为了保持我使用的C++字符串的兼容性,我最终把字符串保存到一个新的文本文件,然后通过系统()来运行ICONV。指挥部

读回输出的字符串后,我得到了比较正常工作所需的格式的字符串


我知道这不是最有效的方法。我曾经有过一个奢侈的Windows环境和Windows.h库,事情会简单得多。不过,在这种情况下,代码在一些很少使用的单元测试中,因此不需要进行高度优化,因此创建、销毁和I/O操作的一些文本文件不是问题。

看起来您的第二个字符串是2byte unicode?您需要告诉我们字符串的确切类型,如何输出它们,以及如何比较它们-请使用代码。myInput的内容是自定义文件扩展名XML文件,尽管用vi打开它们表明它被识别为二进制文件。读取和打印g控制台的文件逐行显示良好,因此我猜我需要将其从二进制流转换为ACSII类型流?当您将文件打印到控制台时,ASCII代码低于32的字符被视为控制代码(例如TAB、CR、LF等)。字符^@(ASCII 0x00)什么都不做,只是被跳过了。Vi将文件识别为二进制,因为这些^@字符。myInput文件似乎是二进制格式的。更多的搜索导致了这篇文章,这篇文章让我走上了正轨。为帮助干杯!
echo "ThisIsATestStringOutputtedToAFile" > test.txt
system("iconv -f UTF-16 -t UTF-8 subStr.txt -o convertedSubStr.txt");