Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 01.08.2011
Сообщений: 176
29.08.2011, 19:18     Диалог открытия файлов и запись в файл #1
Привет всем! Возникла такая проблема: получаю из диалога открытия файла имя файла, в который нужно что-то записать. Вот фрагмент кода:
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". Помогите пожалуйста, а то я прямо не знаю что и делать.
Миниатюры
Диалог открытия файлов и запись в файл   Диалог открытия файлов и запись в файл  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2011, 19:18     Диалог открытия файлов и запись в файл
Посмотрите здесь:

C++ Диалог открытия файла на winApi
C++ Запись названия файлов в текстовый файл
Запись путей файлов в *.txt файл. C++
C++ чтение/запись файлов
Бинарный режим открытия файла; Битовые вхождения в файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DoZZer_
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 ?
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 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
DoZZer_
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.
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 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")
DoZZer_
11 / 11 / 1
Регистрация: 09.08.2011
Сообщений: 53
29.08.2011, 20:39     Диалог открытия файлов и запись в файл #6
http://otvet .mail.ru/question/48041042/ - тут описана твоя проблема
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 22:05     Диалог открытия файлов и запись в файл
Еще ссылки по теме:

Как научить программу выбирать файл для открытия C++
C++ Сканирование всех файлов на компьютере и запись этой информации в файл XML
Хранение и запись файлов C++

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

Или воспользуйтесь поиском по форуму:
Виктор_Сен
 Аватар для Виктор_Сен
29 / 22 / 1
Регистрация: 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;
}
Yandex
Объявления
31.08.2011, 22:05     Диалог открытия файлов и запись в файл
Ответ Создать тему
Опции темы

Текущее время: 21:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru