143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
1

Передача текста (string) из EditBox в файл txt (иероглифы)

13.11.2012, 22:24. Показов 1516. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые программисты, нужна помощь. (Репост в WinApi раздел)
Есть файл, структуры с string элементами и fstream...

В ниже приведённом коде у меня возникла проблема:

В файл заносится только первый символ каждого из трёх элементов(string) - в одной строке.
Пимерно, если в три editboxа ввести: vid, col, 53 (без запятых естественно), то в файл выведется только: "v c 5" вместо полных введённых элементов.

Вот код:

Объявление в глобальных переменных:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct base
{
    string name;
    string work;
    string year;
};
base *array;
base *arrayn;
fstream in("example.txt");
int nl=1;
int nc=0;
string line;
В функции Main:
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
if (!(in.is_open()))
    {
        MessageBox(hWnd, _T("Файл с информацией не найден"), szTitle, MB_OK);
        return 0;
    }
    char cf;
    while (!in.eof())
    {
        in.get(cf);
        if (cf == '\n')
        nl++;
    }
    in.clear();
    in.seekg(0);
    char cd[5]="";
    itoa(nl,cd,10);
    MessageBox(hWnd, (LPCWSTR)cd, _T("Количество строк в файле:"), MB_OK);
    array=new base[nl];
    int kc; // длина строки
    int kp; // кол-во пробелов в строке
    int it[2];
    while (in.good())
    {
        getline (in,line);
        kc = line.size();
        kp = 0;
        for(int i=0;i<kc;i++)
        {
            if(line[i] == ' ')
            {
                kp++;
                if (kp==1)
                    it[0]=i;
                if (kp==2)
                    it[1]=i;
            }
        }
        array[nc].name = line.substr(0, it[0]);
        array[nc].work = line.substr(it[0]+1, it[1]-it[0]-1);
        array[nc].year = line.substr(it[1]+1);
        nc++;
    }
    in.clear();
    in.seekg(0);
Далее в WndProc я объявляю переменные:
C++
1
2
3
string s1;
    string s2;
    string s3;
Здесь я после нажатия кнопки должен получить три строки и если строка не пуста, то выполнить код вставки в конец файла новых данных, но вот и проблема...
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
case ID_BUTTON1:
            {
                GetDlgItemText(hWnd, ID_EDIT, (LPWSTR)s1.c_str(), sizeof(s1));
                GetDlgItemText(hWnd, ID_EDIT1, (LPWSTR)s2.c_str(), sizeof(s2));
                GetDlgItemText(hWnd, ID_EDIT2, (LPWSTR)s3.c_str(), sizeof(s3));
 
                if ( (s1.data()!=0) && (s2.data()!=0) && (s3.data()!=0) ) // - Не работает проверка на пустоту.
                {
//тут объявляется новый динамический массив с +1 символом, старые данные копируются в новый массив.
                    arrayn=new base[nl+1];
                    for (int i=0;i<nl;i++)
                    {
                        arrayn[i].name=array[i].name;
                        arrayn[i].work=array[i].work;
                        arrayn[i].year=array[i].year;
                    }
//тут добавляется новая переменная в структуру
                    arrayn[nl].name = s1.data();
                    arrayn[nl].work = s2.data();
                    arrayn[nl].year = s3.data();
 
                    in.seekg(0,ios::end);
                    in << endl << arrayn[nl].name.c_str() << " " << arrayn[nl].work.c_str() << " " << arrayn[nl].year.c_str();
                    delete[] array;
                    array = arrayn;
                    in.clear();
                    in.seekg(0);
                    MessageBox(hWnd, (LPCWSTR)arrayn[nl].name.c_str(), _T(""), MB_OK);
nl++;
                }
                else
                    MessageBox(hWnd, _T("Вы не ввели какой то элемент."), szTitle, MB_OK);
 
            }
И кстати, если добавляю переменную таким способом:
C++
1
2
3
                    lstrcpy((LPWSTR)arrayn[nl].name.c_str(), (LPWSTR)s1.c_str());
                    lstrcpy((LPWSTR)arrayn[nl].work.c_str(), (LPWSTR)s2.c_str());
                    lstrcpy((LPWSTR)arrayn[nl].year.c_str(), (LPWSTR)s3.c_str());
то MessageBox правильно выводит поле .name
Но ошибка с записью в файл остаётся,.. уже второй день мучаюсь, помогите пожалста )
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2012, 22:24
Ответы с готовыми решениями:

Файл: При сохранение в файл big100.txt в блокноте отображаются иероглифы, почему?
При сохранение в файл big100.txt в блокноте отображаются иероглифы интересно почему...

Иероглифы при импорте текста из txt в RichTextBox (не читает русский язык)
Добрый день, было необходимо сделать импорт текста из txt файла. Сделал кнопку private void...

Как сделать перенос из отдного txt файла текста в другой txt файл в Turbo C?
Надо сделать с потоками. fopen fgets fputs - с этими функциями

Записать 200 случайных чисел в файл a.txt. В файл b.txt вывести четные, а в файл c.txt нечетные
Записать 200 случайных чисел в файл a.txt. В файл b.txt вывести четные, а в файл c.txt нечетные.

6
22 / 7 / 2
Регистрация: 15.10.2012
Сообщений: 33
14.11.2012, 00:27 2
C++
1
GetDlgItemText(hWnd, ID_EDIT, (LPWSTR)s1.c_str(), sizeof(s1));
попробуй вместо sizeof(s1) поставить скажем 100
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
14.11.2012, 09:10  [ТС] 3
Цитата Сообщение от FreeForcer Посмотреть сообщение
C++
1
GetDlgItemText(hWnd, ID_EDIT, (LPWSTR)s1.c_str(), sizeof(s1));
попробуй вместо sizeof(s1) поставить скажем 100
Пробовал! И опять ничего...
Я перед тем как эту прогу делать в App, сначала сделал в консоли и всё там нормально работает... Но тут никак...
Мои предположения о проблеме - кодировка... Правда я не знаю в какую сторону копать даже...
Заменил функцию " << " (форматированного ввода) на :
C++
1
in.write(s1.c_str(),sizeof(s1));
неформатированный (хотябы одного элемента .name)
И в итоге, он мне таки написал введённое слово правда через пробелы, я ввёл "vid", он мне вывел в файл: "v i d"... а потом иероглифы... "МММММ"
Ну я добавил c_str() :
C++
1
in.write(s1.c_str(),sizeof(s1.c_str()));
От "мммм" избавился, но вывел в файл он мне уже только 4 символа: "v i " , т.е. 2 пробела и 2 символа...
Но пробелы мне нафиг не нужны и они не были указаны...
0
Digit@ll
14.11.2012, 12:07
  #4

Не по теме:

И что вы все в юникоде пишите?

0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
14.11.2012, 19:12  [ТС] 5
Ну так Visual Studio в стандарте Unicode стоит... И все факи на юникоде...
Может всё же посоветуете что делать?... Уже и с "fopen" попробовал, и всё равно билеберда =(
0
22 / 7 / 2
Регистрация: 15.10.2012
Сообщений: 33
15.11.2012, 00:09 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
int Save()
{
    FILE *PROP;
    if(PROP = fopen("C:\\Windows\\SM_PROP.dat", "w"))
    {
        for(int i=1;i<=10;i++)
        {
            char ReadChar[260];
    >>>     sprintf(ReadChar, "%S", B_NAME[i]);//     здесь преобразовуем строку из Юникода В Ансии
            int l = 0;
    >>>     while(B_NAME[i][l]!='\0')//     считаем длину строки(не знаю функции которая это делает)
            {
                l++;
            }
    >>>     fwrite(ReadChar, l, 1, PROP);//     записую строку в файл Ансии
            fwrite("\n", 1, 1, PROP);
            l = 0;
            while(B_WAY[i][l]!='\0')
            {
                l++;
            }
            fwrite(B_WAY[i], l, 1, PROP);
            fwrite("\n", 1, 1, PROP);
        }
        fclose(PROP);
    }
    return 0;
}
там где >>> для тебя
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
15.11.2012, 11:27  [ТС] 7
Спасибо за ответ, на досуге посмотрю =)
А пока что я нашёл сам ответ на свой вопрос, и тут конешно каламбур... "найди 2 отличия"...
C++
1
GetDlgItemTextA(hWnd, ID_EDIT, (LPSTR)s1.c_str(), sizeof(s1));
Ответ был найден по этой ссылке:

Вот юрл не отображается но там было "ответ.мэил.ру"(по английски)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2012, 11:27
Помогаю со студенческими работами здесь

сохранение текста в txt файл
Суть вот в чем, мне нужно, что бы по нажатию на кнопку текст из Edit записывался в определенную...

Запись текста в файл txt
Здравствуйте , подскажите как реализовать запись в файл, у меня что то не получается har name;...

Запись текста в файл .txt
Здрасте.. Возникла необходимость в программе, которая бы 1)брала текст им TEdit или Memo и...

Получение текста из EditBox
К примеру я сделал форму, поставил на неё EditBox, у меня есть его индификатор. Как мне получить...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru