Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38

Не считываются русские строки из файла

14.07.2019, 20:16. Показов 5882. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не считываются русские строки из файла выбранного в списке TComboBox, директорию с файлами открывает и имена файлов считываются в TComboBoх, но если выбрать - ошибка открытия файла.

Помогите победить проблему. Спасибо.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 
  WIN32_FIND_DATAA fd; //Данные о файле.
 
    HANDLE hFind =:: FindFirstFileA("Списки\\*.*", &fd); //Указатель для перебора.
    if(hFind != INVALID_HANDLE_VALUE)  //Перебираем файлы папки со списками.
    {
        do
        {
            if(fd.cFileName[0] != '.')  //Выводим имена списков.
                CmbList->Items->Add(fd.cFileName);
        }
        while(::FindNextFileA(hFind, &fd));
        ::FindClose(hFind);
    }
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::CmbListChange(TObject *Sender)  //Выбирает список.
{
   if(CmbList->ItemIndex < 0)
       return;
         //Список не выбран.
 
   wifstream wcin(("Списки" + CmbList->Text).w_str()); //Файл списка.
   if(!wcin.is_open())
   {
    MessageBox(NULL, L"Ошибка, список не загружен!", L"Загрузка списка", MB_OK);
    return;
         //Список не выбран.return;  //Не удалось открыть файл.
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.07.2019, 20:16
Ответы с готовыми решениями:

Неправильно считываются русские символы из консоли
упорно не хочет читать русские символы из консоли :( выводятся нормально, а считывает введенные не правильно ! setlocale(LC_ALL,...

Считывание строки из файла в динамическую память - считываются лишние символы
Здравствуйте. Мне нужно считать текст из файла в строку в динамической памяти. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; ...

Напишите программу, где данные считываются из файла и результат выводится из файла.
Напишите программу, где данные считываются из файла и результат выводится из файла. Найти произведение трех матриц размерностью 3×3.

68
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
14.07.2019, 21:13
если добавить перед открытием файла
C++
1
setlocale(LC_ALL, ".ACP");
то работает и с кириллицей в путях. Только нужно проверить, не изменится ли десятичный разделитель и другие региональные настройки, используемые программой...
2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33192 / 21478 / 8231
Регистрация: 22.10.2011
Сообщений: 36,846
Записей в блоге: 11
14.07.2019, 21:40
Vasily Tyorkin, версия Билдера какая? Начиная с 2010 можно список файлов получать в одну строку, не заморачиваясь с WinAPI... К тому же, ты зачем-то получаешь ansi-строки, но потом работаешь везде с юникодными функциями. В этом есть какой-то смысл, или что?
1
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,335
Записей в блоге: 3
14.07.2019, 21:40
Vasily Tyorkin, судя по всему, версия Билдера у Вас уже юникодная, т.е. модуль IOUtils вполне себе доступен... Так почему же Вы таким допотопным образом файлы ищите?
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
15.07.2019, 15:48  [ТС]
Я уважаемые пытаюсь код с билдера 6 приколхозить в 10.3 Embarcadero, но соломы не хватает, я только начал осваивать тернистый и интересный путь... программирования. В одну строку это как? Заранее благодарен.
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
15.07.2019, 16:03  [ТС]
Спасибо, файлы считываются, но... зюками.
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,335
Записей в блоге: 3
15.07.2019, 16:37
Vasily Tyorkin, пример файла прикрепите.
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
15.07.2019, 16:55  [ТС]
D1973,

Списки.7z

В архиве один оригинальный файл, без расширения, второй сохраненный, как .txt Считываются оба и зюки тоже у обоих файлов. Если я сохраняю в .txt, то в списке он виден с расширением Грибы.txt. Если без, то просто Грибы, как бы логически понятно, нет расширения - нет отображения, но видимость с расширением, как - то не айс... но это уже второй вопрос...
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
15.07.2019, 17:01  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Vasily Tyorkin, версия Билдера какая? Начиная с 2010 можно список файлов получать в одну строку, не заморачиваясь с WinAPI... К тому же, ты зачем-то получаешь ansi-строки, но потом работаешь везде с юникодными функциями. В этом есть какой-то смысл, или что?
volvo,
В одну строку это как?
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,335
Записей в блоге: 3
15.07.2019, 17:41
Ну, как и ожидалось, все хорошо и красиво...
1. В заголовочном файле подключаем модуль System.IOUtils.hpp
2. В классе формы объявляем переменную TStringDynArray A, куда будем записывать полученный список файлов в каталоге
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <System.Classes.hpp>
#include <System.IOUtils.hpp> // << ===
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TComboBox *ComboBox1;
    TMemo *Memo1;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall ComboBox1Change(TObject *Sender);
private:    // User declarations
    TStringDynArray A; // << ===
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
3. В момент создания формы собираем все файлы из каталога C:\TMP и его подкаталогов и заполняем их именами ComboBox
C++
1
2
3
4
5
6
7
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   A = TDirectory::GetFiles("C:\\TMP", "*.*", TSearchOption::soAllDirectories);
   ComboBox1->Clear();
   for(int i = 0; i < A.Length; i++)
     ComboBox1->Items->Add(ExtractFileName(A[i]));
}
4. При выборе любого имени файла отображаем его содержимое в поле Memo
C++
1
2
3
4
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
  Memo1->Lines->LoadFromFile(A[ComboBox1->ItemIndex]);
}
5. Всего и делов-то...
Миниатюры
Не считываются русские строки из файла  
1
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
15.07.2019, 18:33  [ТС]
Спасибо конечно, но потом нужно сделать вот это:

w
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string s;  //Строка.
   getline(wcin, s); //Считываем первую строку.
   n = s.size(); //Определяем размер матрицы.
 
   unsigned i = 0; //Счётчик строк.
   matrix.clear(); //Очищаем матрицу.
   do
   {
      matrix.push_back(s); //Заполняем матрицу.
      getline(wcin, s); //Читаем очередную строку.
   }
   while(++i < n);
 
   ListWords->Items->Clear(); //Очищаем список слов.
   do
   {
      ListWords->Items->Add(s.w_str()); //Заполняем список слов.
      getline(wcin, s); //Читаем следующее слово.
   }
   while(!wcin.eof());

и как быть в этом случае? Я конечно дико извиняюсь!
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
15.07.2019, 18:55  [ТС]
Теперь в матрицу зюки хреначат… ппц, какой-то
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,335
Записей в блоге: 3
15.07.2019, 19:13
Vasily Tyorkin, а давайте ка Вы задание полностью и точно озвучите, без вот этих вот "например". ЧТО КОНКРЕТНО НАДО??? (Простите за крик)
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
15.07.2019, 21:17  [ТС]
Это простенькая реализация "Поиск слов", код из Builder 6.

Она как бы работает, почти....



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <fstream>
#include <string>
#include <vector>
#pragma hdrstop
 
#include "Unit4.h"
#include "Windows.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
using namespace std;
 
struct TLetter  //Данные о букве.
{
    char letter; //Буква.
    unsigned  row, //Индекс строки.
              col;  //Индекс столбца.
    TButton* btn;  //Указатель на кнопку.
};
 
vector<string> matrix;  //Матрица.
 
 
vector<TLetter> word;  //Массив выбранных букв.
 
void __fastcall TForm1::LetterClick(TObject *Sender)  //Выбирает букву.
{
     TLetter l; //Выбранная буква.
     l.btn = (TButton*)Sender;
     l.col = l.btn->Tag % n, l.row = l.btn->Tag / n;
     l.letter = matrix[l.row][l.col];
     unsigned count =  word.size();//Количество выбранных букв.
     if(count)
     {
         TLetter *last = &word[count - 1]; //Предыдущая буква.
         bool inRow = last->row == l.row
                && (l.col == last->col - 1 || l.col == last->col + 1),
              inCol = last->col == l.col
                && (l.row == last->row - 1 || l.row == last->row + 1);
         if(!inRow && !inCol) //Если выбрана буква не по соседству с предыдущей,
         {  //сбрасываем выбор предыдущих букв.
             for(unsigned i = 0; i < count; i++)
                word[i].btn->Font->Size = 20;
             word.clear();
         }
     }
     word.push_back(l);  //Отмечаем выбранную букву.
     l.btn->Font->Size = 30;
 
     string w; //Последовательность выбранных букв.
     for(unsigned i = 0; i <= count; i++) w += word[i].letter;
     int index = ListWords->Items->IndexOf(w.c_str()); //Индекс слова в списке.
     if(index >= 0)
     {   //Если слово в списке есть, удаляем его.
         ListWords->Items->Delete(index);
         word.clear();
     }
 
}
 
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 
  WIN32_FIND_DATA fd; //Данные о файле.
 
    HANDLE hFind =:: FindFirstFile(L"Списки\\*", &fd); //Указатель для перебора.
    if(hFind != INVALID_HANDLE_VALUE)  //Перебираем файлы папки со списками.
    {
        do
        {
            if(fd.cFileName[0] != '.')  //Выводим имена списков.
                CmbList->Items->Add(fd.cFileName);
        }
        while(::FindNextFile(hFind, &fd));
        ::FindClose(hFind);
    }
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::CmbListChange(TObject *Sender)  //Выбирает список.
{
   if(CmbList->ItemIndex < 0)
       return;
         //Список не выбран.
   setlocale(LC_ALL, ".ACP");
 
   ifstream in(("Списки\\" + CmbList->Text).c_str()); //Файл списка.
   if(!in.is_open())
   {
    MessageBox(NULL, L"Ошибка, список не загружен!", L"Загрузка списка", MB_OK);
    return;
         //Список не выбран.return;  //Не удалось открыть файл.
    }
   string s;  //Строка.
   getline(in, s); //Считываем первую строку.
   n = s.size(); //Определяем размер матрицы.
 
   unsigned i = 0; //Счётчик строк.
   matrix.clear(); //Очищаем матрицу.
   do
   {
      matrix.push_back(s); //Заполняем матрицу.
      getline(in, s); //Читаем очередную строку.
   }
   while(++i < n);
 
   ListWords->Items->Clear(); //Очищаем список слов.
   do
   {
      ListWords->Items->Add(s.c_str()); //Заполняем список слов.
      getline(in, s); //Читаем следующее слово.
   }
   while(!in.eof());
 
   for(int i = 0, cc = PanelWords->ComponentCount; i < cc; i++)
      delete PanelWords->Components[i]; //Удалем кнопки предыдущей матрицы.
 
   for(unsigned  i = 0; i < n; i++)
      for(unsigned  j = 0; j < n; j++)
      {
          TButton *btn = new TButton(this); //Создаём новую кнопку.
          btn->Width = 50;  //Задаём размеры.
          btn->Height = 50;  //Задаём координаты.
          btn->Left = 50*j;
          btn->Top = 50 * i;
          btn->Parent = PanelWords;
          btn->Caption = matrix[i][j]; //Показываем букву.
          btn->Tag = i * n + j;
          btn->OnClick = LetterClick; //Задаём обработчик кликов.
          btn->Font->Size = 20;
      }
 
   in.close(); //Закрываем файл.
}
Добавлено через 31 секунду
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//---------------------------------------------------------------------------
 
#ifndef Unit4H
#define Unit4H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *BtnReset;
    TLabel *Label1;
    TLabel *Label2;
    TScrollBox *PanelWords;
    TPanel *Panel1;
    TListBox *ListWords;
    TComboBox *CmbList;
    void __fastcall CmbListChange(TObject *Sender); //Открывает список слов.
 
private:
        unsigned n; //Размер матрицы.
        void __fastcall LetterClick(TObject *Sender);  //Выбирает букву.
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Добавлено через 50 минут
Но с кодировкой какая-то задница... В 6 Билдере работает, в Embarcadero косяки.
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,335
Записей в блоге: 3
16.07.2019, 04:22
Vasily Tyorkin, Вам же говорили - работайте методами Билдера - все нормально будет... Нет же, Вас несет в эту СИ-шную заумь...

Добавлено через 48 секунд

Не по теме:

А суть Вашего задания я так и не понял...

0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
16.07.2019, 11:56  [ТС]
Код не мой, а самому знаний не хватает... На счёт задания, нужно, с тебя в список и в матрицу из файла попадали русские символы, вот и все, остальной алгоритм работает.
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,335
Записей в блоге: 3
16.07.2019, 12:53
Цитата Сообщение от Vasily Tyorkin Посмотреть сообщение
нужно, с тебя...
С меня? Эвона как... Я уже что-то кому-то должен?
Цитата Сообщение от Vasily Tyorkin Посмотреть сообщение
в список и в матрицу из файла попадали русские символы
вот это мне и не понятно: матрица как формируется, по какому принципу?

Добавлено через 37 минут
Цитата Сообщение от Vasily Tyorkin Посмотреть сообщение
В 6 Билдере работает
Кидайте рабочий проект для 6-ки - проще разобраться будет...
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
16.07.2019, 20:30  [ТС]
Нет не с тебя, это млятский т9, извиняюсь!

Добавлено через 14 минут
Код, который я скидывал, это копипаста из Билдера 6, файлы тоже кидал. Матрица инициализируется путем считывания первых строк из файла, автоматом сделать не знаю как, кто делал говорил, что это сложно. Вот и все.
Ещё раз извиняюсь, никто мне конечно же не должен, просто, очень нужно что бы этот код работал на Embarcadero!
0
0 / 0 / 0
Регистрация: 04.07.2019
Сообщений: 38
16.07.2019, 21:02  [ТС]
В файлике первые строки это ручная шифровка слов в списке, потом идут сами слова.

В архиве весь проект с описанием. Word_search_B6.7z
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
16.07.2019, 22:39
Vasily Tyorkin,
1.
C++
1
vector<String> matrix;  //Матрица
string меняешь на String
2.
C++
1
2
    String us = s.c_str();
      matrix.push_back(us); //Заполняем матрицу.
3.
C++
1
for(unsigned  j = 1; j <= n; j++)
Смещаем диапазон прохода на 1 в большую сторону, т.к. у String индексация с единицы.

Это если не переписывать весь код...

Добавлено через 12 минут
И ещё, чтобы правильный ответ сработал
C++
1
wchar_t letter; //Буква.
char замени на wchar_t
C++
1
String w; //Последовательность выбранных букв.
string на String
C++
1
int index = ListWords->Items->IndexOf(w); //Индекс слова в списке.
убираешь .c_str()

Добавлено через 11 минут
ещё где-то индексы надо сместить, при клике в последней колонке выход за пределы получается. Наверное, сам найдёшь уж...

Добавлено через 51 минуту
C++
1
2
l.col = (l.btn->Tag - 1) % n + 1;
l.row = (l.btn->Tag - 1) / n;
Вот так всё работает. Прошёл грибы и собак )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2019, 22:39
Помогаю со студенческими работами здесь

Не считываются пробелы из файла
Допустим пытаюсь считать из файла &quot;ghf fk ff 123 1&quot;, а выводится/считывается &quot;ghffkff1231&quot; В чем может быть проблема? #include...

Из типизированного файла считываются не те числа
Здравствуйте. Есть программа, которая считывает числа из файла в массив. uses crt; type mas=array of integer; procedure...

Из файла считываются лишние символы
Всем доброго времени суток. Вот недавно во время выполнения лабороторной в школе столкнулся со следующей проблемой. FILE* src =...

Неправильно считываются символы из файла
FILE *input; FILE *output; input=fopen(&quot;input.txt&quot;,&quot;r&quot;); output=fopen(&quot;output.txt&quot;,&quot;w&quot;); char a; int i; ...

Не считываются пробелы из бинарного файла
Всем салют. Завис на одной проблемке, может кто поможет? При побайтовом считывании бинарного файла (для примера расширение .png),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru