我试图找出我所拥有的两个字符串是否相同,以进行单元测试。第一个是预定义的字符串,硬编码到程序中。第二个是使用std :: getline()从ifstream文本文件读入,然后作为子字符串。这两个值都存储为C ++字符串。
当我使用cout将两个字符串输出到控制台进行测试时,它们看起来都是相同的:
ThisIsATestStringOutputtedToAFile ThisIsATestStringOutputtedToAFile
但是,string.compare返回说明它们不相等。输出到文本文件时,两个字符串显示如下:
ThisIsATestStringOutputtedToAFile T 1 @ H ^ @ I ^ @š^ @ I ^ @小号^ @甲^ @ T ^ | E ^ @小号^ @ T ^ @小号^ @ T ^ 2 R ^ @ I ^ @ N ^ @ G ^ @ o ^ @ú^ @ T ^ @ p 1 @ú^ @ T ^ @ 吨^ | E ^ @ d ^ @ T ^ @ o ^ @甲^ @频率^ @ I ^ @ L ^ @ë
我猜这是某种编码问题,如果我使用的是我的母语(旧的C#),我就不会有太多问题。因为我是C / C ++和Vi,坦率地说,不知道从哪里开始!我试过看可能转换为/来自ansi / unicode,也删除了奇怪的字符,但我甚至不确定它们是否真的存在..
提前感谢任何建议。
EDIT 道歉,这是我第一次在这里发帖。下面的代码是我如何完成整个过程:
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);
答案 0 :(得分:1)
您是如何创建myInput
的内容的?我猜这个文件是用双字节编码创建的。您可以使用hex-dump验证此理论,或使用其他编辑器创建此文件。
最简单的方法是启动cmd.exe并输入
echo "ThisIsATestStringOutputtedToAFile" > test.txt
更新:
如果您无法更改myInput
文件的编码,则可以尝试在程序中使用wide-chars。即使用wstring
代替string
,wifstream
代替ifstream
,wofstream
,wcout
等。
答案 1 :(得分:0)
以下适用于我,并将下面粘贴的文本写入文件。请注意字符串中嵌入的'\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;
}
输出:
ThisIsATestStringOutputtedToAFile ThisIsATestStringOutputtedToAFile
答案 2 :(得分:0)
事实证明,问题是myInput的文件编码是UTF-16,而比较字符串是UTF-8。使用我对该项目(Linux,C / C ++代码)的操作系统限制来转换它们的方法是使用iconv()函数。为了保持我一直使用的C ++字符串的兼容性,我最终将字符串保存到新的文本文件,然后通过system()命令运行iconv。
system("iconv -f UTF-16 -t UTF-8 subStr.txt -o convertedSubStr.txt");
然后读回输出的字符串,然后给出了我需要的格式的字符串,以便比较正常工作。
请注意 我知道这不是最有效的方法。我已经拥有了Windows环境和windows.h库的奢侈品,事情本来会容易得多。但在这种情况下,代码在一些很少使用的单元测试中,因此不需要高度优化,因此某些文本文件的创建,销毁和I / O操作不是问题。