Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2023, 15:09   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Неправильно считываются русские символы из файла в программе на Qt Creator

Я создал программу на Visual C++ 2012 под Windows. Потом я перенёс её на другой компьютер, где стоит Astra Linux, пересобрал в QT Creator (версия Qt 5.15.2) и запустил её.
В этой программе происходит считывание строк, содержащих русские символы и вывод данных из этих строк в комбобокс с чекбоксами. Кодировка текстового файла--UTF-8. Вот код:

Код:
f = fopen("MyNIPs.txt","rt");
if (f!=NULL)
{
      fgets(s,256,f);
      fgets(s,256,f);
      while (!feof(f))
      {
            fgets(s,256,f);
            myString = QString::fromUtf8(s);
            stdstr = myString.toStdString();
            strcpy(s,stdstr.c_str());
            sscanf(s,"%s %s %s %s",sname,sX,sY,sZ);
            X = atof(sX);
            Y = atof(sY);
            Z = atof(sZ);
            strcpy(myNIPstruct.name,sname);
            myNIPstruct.X = X;
            myNIPstruct.Y = Y;
            myNIPstruct.Z = Z;
            NIParray.push_back(myNIPstruct);
      }
}
fclose(f);
n = NIParray.size();
if (n>0)
{
     QStandardItemModel* model = QStandardItemModel(n,1,ui->comboBox_20);
     for (i=0; i<n; i++)
     {
          myNIPstruct = (NIPstruct)NIParray.at(i);
          strcpy(sname,myNIPstruct.name);
          sprintf(sname2," %s",sname);
          mySprintf = QString(sname2);
          QStandardItem* item = new QStandardItem;
          item->setText(myString);
          item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
          item->setData(Qt::Unchecked, Qt::CheckStateRole);
          model->insertRow(i,item);
     }
     ui->comboBox_20->show();
     ui->comboBox_20->setModel(model);
     ui->comboBox_20->repaint();
}
else
{
     QMessageBox::information(0,"Ошибка","В файле NIPs.txt отсутствуют данные.");
}
Под Windows всё нормально работает--строки считываются с правильным отображением кириллических символов и в комбобокс с чекбоксами русские символы выводятся правильно.
А под Astra Linux проблема--в считываемых строках вместо кириллических символов находится какая-то абракадабра и эта абракадабра выводится в комбобокс с чекбоксами.

В чём причина этой проблемы? Как исправить эту ошибку?
erslgoeirjh вне форума Ответить с цитированием
Старый 23.08.2023, 08:49   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

1)
Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
"rt"
t - что за режим такой ? Не вижу в доках. Оставляй просто "r"

2)
код не полный. Нет возможности запустить и проверить. Также нужно прикрепить к посту файл "MyNIPs.txt"

3)
Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
sscanf(s,"%s %s %s %s",sname,sX,sY,sZ);
X = atof(sX);
Y = atof(sY);
Z = atof(sZ);
для чего тут sX,sY,sZ, если можно сразу считывать %f в переменные?

4)
и - раз доступен C++, зачем используется C-стиль? std::ifstream + std::string
Алексей1153 вне форума Ответить с цитированием
Старый 23.08.2023, 08:52   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
myString = QString::fromUtf8(s);
stdstr = myString.toStdString();
strcpy(s,stdstr.c_str());
sscanf(s,"%s %s %s %s",sname,sX,sY,sZ);
тут какие-то явно лишние манипуляции. Сначала перегоняешь из utf8 в utf16, затем обратно из utf16 в utf8, затем парсишь. Надо бы сразу парсить и всё. А sname будет в utf8
Алексей1153 вне форума Ответить с цитированием
Старый 30.08.2023, 11:44   #4
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Цитата:
f = fopen("MyNIPs.txt","rt");
Зачем использовать Qt и не использовать его возможности, почему QFile не заюзать?

Ну и по теме непосредственно: вероятно, исходный файл у тебя в кодировке иной, нежели UTF-8.
Я бы сделал примерно так:

Код:
QFile file(file_name);
if (!file.open(QIodevice::ReadOnly)) {
   // тут мессадж о косяке
   return;
   }

QTextStream stream(&file);
stream.setCodec("Windows-1251"); // если в файле реально эта кодировка

while (!stream.atEnd()) {
   QString string=stream.readLine();
   // че-то делаешь со строкой
   }

Последний раз редактировалось Subst; 30.08.2023 в 11:49.
Subst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
русские символы неправильно отображаются getUp Общие вопросы C/C++ 5 09.06.2014 11:03
RAD XE6 русские символы GGaDz Qt и кроссплатформенное программирование С/С++ 1 24.04.2014 11:39
Неправильно отображаются русские буквы Merano Общие вопросы Delphi 2 12.12.2012 16:14
Из текстового файла,содержащего русские и латинские слова создать 2 новых файла: 1-й-русские,2-й - латинские (паскаль для девушки) beygul Помощь студентам 5 28.03.2012 14:26
Из файла считываются не те значения al-udmi Общие вопросы C/C++ 2 20.12.2011 23:44