Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
1

Диалог открытия файлов и запись в файл

29.08.2011, 19:18. Просмотров 3012. Ответов 7
Метки нет (Все метки)

Привет всем! Возникла такая проблема: получаю из диалога открытия файла имя файла, в который нужно что-то записать. Вот фрагмент кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    private: System::Void openButton_Click(System::Object^  sender, System::EventArgs^  e) {                    
                 //Запуск диалога
                 if (mainOpenFileDialog->ShowDialog()==System::Windows::Forms::DialogResult::OK)
                 {  
                     //Преобразование строки
                     char *fileName=new char[mainOpenFileDialog->FileName->Length+1];
                     for (int i=0;i<mainOpenFileDialog->FileName->Length;i++)
                     {
                         fileName[i]=(char)mainOpenFileDialog->FileName[i];
                     }      
                     fileName[mainOpenFileDialog->FileName->Length]=0;
 
                     //Запись в файл
                     FILE *picFile;
                     picFile=fopen(fileName,"w");
                     putc('a',picFile);
                     fclose(picFile);
                 }
             }
    };
Но при выполнении для имён файлов с русскими буквами возникает ошибка. Мне подсказали, что это из-за несовпадения кодировок, и нужно использовать функцию OemToChar. Но какие параметры этой функции я не знаю. Справка не особо помогла, вот что там написано: BOOL WINAPI OemToChar(
__in LPCSTR lpszSrc,
__out LPTSTR lpszDst
);. Но что это за типы данных я не знаю, и как можно перевести их в обычную строку и обратно я не знаю. Пробовал написать вот что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Test4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    LPCSTR a="АБВ";
    LPTSTR b;
    OemToChar(a,b);
    return 0;
}
, но снова возникает ошибка (ошибка2), в которой сообщается, что переменная "b" не инициализированна, но как её проинициализоровать я не знаю. Написал
C++
1
LPTSTR b="";
, но в таком случае возникает ошибка при компилировании - "Error 1 error C2440: 'initializing' : cannot convert from 'const char [1]' to 'LPTSTR' i:\doc\dev\c++ visual studio\test4\test4\test4.cpp 13 Test4". Помогите пожалуйста, а то я прямо не знаю что и делать.
0
Миниатюры
Диалог открытия файлов и запись в файл   Диалог открытия файлов и запись в файл  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2011, 19:18
Ответы с готовыми решениями:

Создать свой диалог открытия файлов
Возник вопрос: а как вообще создать аналог opendialog?Есть допустим форма.Объект выбран.И что...

Диалог открытия файлов и папок одновременно
Диалог открытия файлов: dialog = new QFileDialog(); ...

Стандартный диалог для открытия файлов
Всем добрый вечер! Подскажите пожалуйста существует ли такой стандартный диалог, который выбирает...

PyQt5: в Qt Designer Диалог открытия и сохранения файлов?
Добрый день! Есть ли в PyQt5 в Qt Designer Диалог открытия и сохранения файлов? Или нужно отдельно...

7
11 / 11 / 1
Регистрация: 09.08.2011
Сообщений: 53
29.08.2011, 20:10 2
Цитату с сайта приведу :

Кроме того в классе CString есть оператор LPCTSTR

operator LPCTSTR ( ) const;

Этот оператор позволяет получить доступ к строке в стиле C. Возвращается только указатель. Вот пример кода

CString s;
LPCTSTR lp;
s="Hi";
lp = (LPCTSTR) s;
printf(lp);
return 0;
З.Ы.: А если вы хотите получить сhar, то почему ваша 2я переменная b - не типа char ?
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
29.08.2011, 20:19  [ТС] 3
Цитата Сообщение от DoZZer_ Посмотреть сообщение
З.Ы.: А если вы хотите получить сhar, то почему ваша 2я переменная b - не типа char ?
Потому что если написать
C++
1
2
    char b;
    OemToChar(a,b);
, то компилятор заругается: Error 1 error C2664: 'OemToCharW' : cannot convert parameter 2 from 'char' to 'LPWSTR' i:\doc\dev\c++ visual studio\test4\test4\test4.cpp 15 Test4
0
11 / 11 / 1
Регистрация: 09.08.2011
Сообщений: 53
29.08.2011, 20:29 4
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Потому что если написать
C++
1
2
    char b;
    OemToChar(a,b);
, то компилятор заругается: Error 1 error C2664: 'OemToCharW' : cannot convert parameter 2 from 'char' to 'LPWSTR' i:\doc\dev\c++ visual studio\test4\test4\test4.cpp 15 Test4
Т.е. "не могу перевести параметр 2 из char в LPWSTR", т.е. вы изначально вводили данные не в тот параметр... Данные вводятся в параметр *b*, и из него конвертируются в параметр *a* в виде char.
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
29.08.2011, 20:35  [ТС] 5
Цитата Сообщение от DoZZer_ Посмотреть сообщение
Данные вводятся в параметр *b*, и из него конвертируются в параметр *a* в виде char.
Нет, в справке написано
BOOL WINAPI OemToChar(
__in LPCSTR lpszSrc,
__out LPTSTR lpszDst
); То есть данные вводятся в первый параметр (то есть в "a"), а выводятся во второй (то есть "b")
0
11 / 11 / 1
Регистрация: 09.08.2011
Сообщений: 53
29.08.2011, 20:39 6
http://otvet .mail.ru/question/48041042/ - тут описана твоя проблема
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
30.08.2011, 12:46  [ТС] 7
Не работает, как там написано:
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
// Test4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    //LPCSTR a="АБВ";
    //LPTSTR b;
    //OemToChar(a,b);
 
    char buf[256];
    CharToOem("Привет мир", buf); 
    cout << buf << endl; 
    // или так 
    //char *ss = "введите слово русскими буквами:"; 
    //CharToOem(ss, buf); 
    //cout << buf << endl; 
    getch(); 
    return 0;
}
Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char [11]' to 'LPCWSTR' i:\doc\dev\c++ visual studio\test4\test4\test4.cpp 18 Test4

Добавлено через 4 минуты
Но вот так ведь компилировалось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Test4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    LPCSTR a="АБВ";
    LPTSTR b;
    OemToChar(a,b);
    getch(); 
    return 0;
}
, просто возникала ошибка, что "b" не инициализирован. Может подскажите, как проинициализировать "b". Ну и как перевести mainOpenFileDialog->FileName в LPCSTR и как перевести LPTSTR в char.
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
31.08.2011, 22:05  [ТС] 8
Всё, проблема решена. Вот так работает:
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
// Test4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t *a=new wchar_t[10];
    for (int i=0;i<9;i++)
    {
        a[i]=i+1040;
    }
    a[9]=0;
    char *b=new char[10];
    CharToOem(a,b);
    cout<<b;
    _getch(); 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2011, 22:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как в Access запустить диалог открытия файлов?
Привет всем. Может кто знает, как в Access 2000 открыть диалог открытия файлов. Заранее благодарен.

Напомните, как вызвать диалог открытия файлов
Напомните, как вызвать диалог открытия файлов.

Как внести в диалог открытия файлов Qt позицию для обзора сети?
&quot;Родной диалог открытия файлов Windows имеет позицию &quot;Сеть&quot;, выбор которой приводит к подключению...

Диалог для открытия каталога
Нужен диалог для открытия каталога (но не файла). TDialogOpen не подходит по той причине, что там...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.