C ++ - string.compare проблемы, когда вывод в текстовый файл отличается от вывода консоли? - PullRequest
0 голосов
/ 19 ноября 2009

Я пытаюсь выяснить, совпадают ли две строки, которые у меня есть, для модульного тестирования. Первая - это предопределенная строка, жестко запрограммированная в программе. Второй - чтение из текстового файла с помощью ifstream с использованием std :: getline (), а затем взятие в качестве подстроки. Оба значения хранятся в виде строк C ++.

Когда я выводю обе строки на консоль, используя cout для тестирования, они кажутся идентичными:

ThisIsATestStringOutputtedToAFile ThisIsATestStringOutputtedToAFile

Однако string.compare возвращает сообщение о том, что они не равны. При выводе в текстовый файл две строки выглядят следующим образом:

ThisIsATestStringOutputtedToAFile Т ^ @ ч ^ @ я ^ @ S ^ @ I ^ @ S ^ @ А ^ @ Т ^ @ Ек @ S ^ @ т ^ @ S ^ @ т ^ @ г ^ @ я ^ @ п ^ @ г ^ @ O ^ @ и ^ @ т @ ^ р ^ @ и ^ @ т @ ^ т ^ @ е ^ @ д ^ @ т @ ^ о ^ @ А ^ @ Р ^ @ я ^ @ ^ @ л е

Я предполагаю, что это какая-то проблема кодирования, и если бы я был на своем родном языке (старый добрый 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);

Ответы [ 3 ]

1 голос
/ 19 ноября 2009

Как вы создали контент myInput? Я предполагаю, что этот файл создан в двухбайтовой кодировке. Вы можете использовать hex-dump для проверки этой теории или использовать другой редактор для создания этого файла.

Самый простой способ - запустить cmd.exe и набрать

echo "ThisIsATestStringOutputtedToAFile" > test.txt

UPDATE:

Если вы не можете изменить кодировку файла myInput, вы можете попробовать использовать широкие символы в своей программе. То есть используйте wstring вместо string, wifstream вместо ifstream, wofstream, wcout и т. д.

0 голосов
/ 20 ноября 2009

Оказывается, проблема заключалась в том, что кодировка файла myInput была UTF-16, тогда как строка сравнения была UTF-8. Способ конвертировать их с ограничениями ОС, которые я имел для этого проекта (Linux, код C / C ++), заключался в использовании функций iconv (). Чтобы сохранить совместимость строк C ++, которые я использовал, я сохранил строку в новый текстовый файл, а затем запустил iconv с помощью команды system ().

system("iconv -f UTF-16 -t UTF-8 subStr.txt -o convertedSubStr.txt");

Чтение выведенной строки обратно затем дало мне строку в формате, который мне нужен для правильного сравнения.

Примечание Я знаю, что это не самый эффективный способ сделать это. У меня была бы роскошь среды Windows и библиотек windows.h, все было бы намного проще. Однако в этом случае код использовался в некоторых редко используемых модульных тестах, и поэтому его не нужно было сильно оптимизировать, поэтому операции создания, уничтожения и ввода-вывода некоторых текстовых файлов не были проблемой.

0 голосов
/ 19 ноября 2009

Следующее работает для меня и пишет текст, вставленный ниже в файл. Обратите внимание на символ '\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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...