Qt C ++ macOS проблема.Я ищу слова в мультимножестве с функцией .find ("слово"), она работает на Windows, но не на Mac - PullRequest
0 голосов
/ 14 апреля 2019

Я написал некоторый код, который загружает некоторые файлы, содержащие список слов (одна строка слова pr).каждое слово добавляется в мультимножество.позже я пытаюсь найти мультимножество с помощью multiset.find ("aWord").где я ищу слово и подстроки слова в мультимножестве.

Этот код отлично работает, если я компилирую его с помощью qt в системе Windows.

Но не работаю, если я компилируюэто в qt на моем mac!

моя цель - заставить его работать с qt на моем mac.

Я просыпаюсь на MacBook Air (13 "в начале 2018) с

macOS Majave version 10.14.4 instalation
Buil version 18E226
local 18.5.0 Darwin Kernel Version 18.5.0: Mon Mar 11 20:40:32 PDT 
2019; root:xnu-4903.251.3~3/RELEASE_X86_64 x86_64

Использование установки qt: QTKit:

  Version: 7.7.3
  Obtained from: Apple
  Last Modified: 13/04/2019 12.11
  Kind: Intel
  64-Bit (Intel): Yes
  Get Info String: QTKit 7.7.3, Copyright 2003-2012, Apple Inc.
  Location: /System/Library/Frameworks/QTKit.framework
  Private: No

Установка xcode:

  Xcode 10.2
  Build version 10E125 

Я попытался распечатать: все строки, которые я ищу, и каждуюЯ должен найти строку в мультисете в шестнадцатеричном формате и пришел к выводу, что некоторые буквы не совпадают. Там есть шестнадцатеричное значение. Несмотря на то, что я думаю, что вся моя система запускает utf-8 и файл также имеет кодировку utf-8.

Dictionary.h

  #ifndef DICTIONARY_H
  #define DICTIONARY_H
  #include <iostream>
  #include <vector>
  #include <set>

  class Dictionary
  {
  public:
      Dictionary();
      void SearchForAllPossibleWordsIn(std::string searchString);

  private:
      std::multiset<std::string, std::less<std::string>> mDictionary;

      void Initialize(std::string folder);
      void InitializeLanguage(std::string folder, std::string languageFileName);
  };

  #endif // DICTIONARY_H

Dictionary.cpp

#include "Dictionary.h"
#include <vector>
#include <set>
#include <iostream>
#include <fstream>
#include <exception>

Dictionary::Dictionary()
{
    Initialize("../Lektion10Projekt15-1/");
}

void Dictionary::Initialize(std::string folder)
{
    InitializeLanguage(folder,"da-utf8.wl");
}

void Dictionary::InitializeLanguage(std::string folder, std::string languageFileName)
{
    std::ifstream ifs;

    ifs.open(folder+languageFileName,std::ios_base::in);
    if (ifs.fail()) {
        std::cerr <<"Error! Class: Dictionary. Function: InitializeLanguage(...). return: ifs.fail to load file '" + languageFileName + "'"  << std::endl;
    }else {
        std::string word;

        while (!ifs.eof()) {
            std::getline(ifs,word);

            mDictionary.insert(word);
        }
    }
    ifs.close();
}

void Dictionary::SearchForAllPossibleWordsIn(std::string searchString)
{
    std::vector<std::string> result;

    for (unsigned int a = 0 ; a <= searchString.length(); ++a) {
        for (unsigned int b = 1; b <= searchString.length()-a; ++b)     {

            std::string substring = searchString.substr(a,b);

            if (mDictionary.find(substring) != mDictionary.end())
            {
                result.push_back(substring);
            }
        }
    }

    if (!result.empty()) {
        for (unsigned int i = 0; i < result.size() ;++i) {
            std::cout << result[i] << std::endl;
        }
    }
}

main.cpp

#include <iostream>
#include "Dictionary.h"

int main()
{
    Dictionary myDictionary;

    myDictionary.SearchForAllPossibleWordsIn("byggearbejderen");

    return 0;
}

Я попытался изменить следующую строку в main.cpp

    myDictionary.SearchForAllPossibleWordsIn("byggearbejderen");

до (OBS: первое слово в списке слов byggearbejderen)

    std::ifstream ifs;
    ifs.open("../Lektion10Projekt15-1/da-utf8.wl",std::ios::in);
    if (ifs.fail()) {
        std::cerr <<"Error!" << std::endl;
    }else {
        std::getline(ifs,searchword);
    }
    ifs.close();
    myDictionary.SearchForAllPossibleWordsIn(searchword);

А затем в маиn.cpp добавить сом распечатать с ожидаемой строкой и подстрокой в ​​шестнадцатеричном значении.

    std::cout << " cout as hex test:" << std::endl;

    myDictionary.SearchForAllPossibleWordsIn(searchword);

    std::cout << "Suposet search resul for ''bygearbejderen''" << std::endl;

    for (char const elt: "byggearbejderen")
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(elt) << "  ";
    std::cout << "byggearbejderen" << std::endl;

    for (char const elt: "arbejderen")
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(elt) << "  ";
    std::cout  << "arbejderen" << std::endl;

    for (char const elt: "ren")
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(elt) << "  ";
    std::cout  << "ren" << std::endl;

    for (char const elt: "en")
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(elt) << "  ";
    std::cout  << "en" << std::endl;

    for (char const elt: "n")
        std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(elt) << "  ";
    std::cout  << "n" << std::endl;

А также добавил тот же отпечаток в отпечаток результата в Dictonary.cpp

std::cout << "result of seartchword as hex" << std::endl;
if (!result.empty()) {
    for (unsigned int i = 0; i < result.size() ;++i)
    {
        for (char const elt: result[i] )
        {
            std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(elt) << "  ";
        }
        std::cout  << result[i] << std::endl;


    }
}

, который дал следующий вывод:

result of seartchword as hex
ffffffef  ffffffbb  ffffffbf  62  79  67  67  65  61  72  62  65  6a  64  65  72  65  6e  0d  byggearbejderen
61  72  62  65  6a  64  65  72  65  6e  0d  arbejderen
72  65  6e  0d  ren
65  6e  0d  en
6e  0d  n
Suposet search resul for ''bygearbejderen''
62  79  67  67  65  61  72  62  65  6a  64  65  72  65  6e  00  byggearbejderen
61  72  62  65  6a  64  65  72  65  6e  00  arbejderen
72  65  6e  00  ren
65  6e  00  en
6e  00  n

где IОбратите внимание, что некоторые значения были разными.Я не знаю, почему это так, когда я нахожусь на MacOS, но не на Windows.Я не знаю, есть ли какие-либо настройки кодирования в моей среде, которые мне нужно изменить или установить правильно.

Мне бы хотелось, чтобы мой main.cpp выглядел так:

#include <iostream>
#include "Dictionary.h"

int main()
{
    Dictionary myDictionary;

    myDictionary.SearchForAllPossibleWordsIn("byggearbejderen");

    return 0;
}

, что привело к следующему выводу:

byggearbejderen
arbejderen
ren
en
n

1 Ответ

0 голосов
/ 14 апреля 2019

Окончания строк для текстовых файлов отличаются в Windows от Mac. Windows использует оба символа CR / LF (коды ASCII 13 и 10 соответственно). Старые Маки использовали только символ CR, системы Linux используют только LF. Если вы создаете текстовый файл в Windows, а затем копируете его на свой Mac, окончания строк могут быть обработаны неправильно.

Если вы посмотрите на последний символ в вашем выводе, вы увидите, что это 0d, который будет символом CR. Я не знаю, как вы сгенерировали этот вывод, но возможно, что getline на Mac воспринимает его как нормальный символ и включает его в строку, которая была прочитана.

Самое простое решение - либо обработать этот текстовый файл заранее, чтобы получить правильные окончания строк, либо убрать CR из конца слов после их прочтения.

...