どうにもわからなかったので質問させてください
まずやりたいことですが、ビットマップファイルの中身を一定の法則に従って変換したいと思っています。
バイナリエディタを使い1つ1つやることで可能ですが、非現実的ですので、そういうアプリケーションを作るのが目的です。
ビットマップファイルの数もそれなりにあるので、ファイルのドラッグ&ドロップで一気に出来るようにしたいと考えています。
環境はVisual Basic 2010 Express c++ です
http://d.hatena.ne.jp/n2n/20060829/p1
ここを参考にほぼそのままコードを書いて試したところ
ドラッグ&ドロップした複数ファイルのパスを、順に表示することは出来ました。
しかし、ファイルのパスが入っている変数が string型 というものらしく
fopen等で開くためにはchar型への変換が必要とあったので、.c_strを使って変換しようとしたのですが
これが全く上手くいきません。
「’.c_str()’の左側はクラス、構造体、共用体でなければなりません。」というエラーが出ます。
正直なところ、ほぼ丸写ししたためにコードの意味もろくに理解していないのですが、どこをどう直せばいいのでしょうか?
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string>
namespace 変換 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Form1 の概要
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクター コードを追加します
//
}
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private:
/// <summary>
/// 必要なデザイナー変数です。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->SuspendLayout();
//
// Form1
//
this->AllowDrop = true;
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Name = L"Form1";
this->Text = L"Form1";
this->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::Form1_DragDrop);
this->DragEnter += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::Form1_DragEnter);
this->ResumeLayout(false);
}
#pragma endregion
private: System::Void Form1_DragEnter(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
//ドラッグされたのがファイルなら受け付ける、それ以外なら無視
if(e->Data->GetDataPresent(::System::Windows::Forms::DataFormats::FileDrop)){
e->Effect=::System::Windows::Forms::DragDropEffects::All;
}
else{
e->Effect=::System::Windows::Forms::DragDropEffects::None;
}
}
private: System::Void Form1_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
//ドロップされたときの処理
if(e->Data->GetDataPresent(::System::Windows::Forms::DataFormats::FileDrop)){
array<String^>^files = (array<String^>^)e->Data->GetData(DataFormats::FileDrop);
FILE *fp;
char *s;
for(int i=0;i<files->Length;i++){
MessageBox::Show( files );
*s=files.c_str();//ここでエラー
/*if ((fp=fopen(s,"rb"))==NULL){
MessageBox::Show("なんかエラーです");
exit(EXIT_FAILURE);
}
fclose(fp);*/
}
}
}
};
}
string型からの変換 .c_str() について
Re: string型からの変換 .c_str() について
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string>
namespace 変換 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Form1 の概要
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクター コードを追加します
//
}
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private:
/// <summary>
/// 必要なデザイナー変数です。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->SuspendLayout();
//
// Form1
//
this->AllowDrop = true;
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Name = L"Form1";
this->Text = L"Form1";
this->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::Form1_DragDrop);
this->DragEnter += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::Form1_DragEnter);
this->ResumeLayout(false);
}
#pragma endregion
private: System::Void Form1_DragEnter(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
//ドラッグされたのがファイルなら受け付ける、それ以外なら無視
if(e->Data->GetDataPresent(::System::Windows::Forms::DataFormats::FileDrop)){
e->Effect=::System::Windows::Forms::DragDropEffects::All;
}
else{
e->Effect=::System::Windows::Forms::DragDropEffects::None;
}
}
private: System::Void Form1_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
//ドロップされたときの処理
if(e->Data->GetDataPresent(::System::Windows::Forms::DataFormats::FileDrop)){
array<String^>^files = (array<String^>^)e->Data->GetData(DataFormats::FileDrop);
FILE *fp;
char *s;
for(int i=0;i<files->Length;i++){
MessageBox::Show( files[i] );
*s=files[i].c_str();//ここでエラー
/*if ((fp=fopen(s,"rb"))==NULL){
MessageBox::Show("なんかエラーです");
exit(EXIT_FAILURE);
}
fclose(fp);*/
}
}
}
};
}
Re: string型からの変換 .c_str() について
C++/CLIはわからないので推測ですが、まず78行目にSystem::Windows::Forms::DragEventArgs^ eという宣言があり、
80行目にe->Data->GetDataPresent(::System::Windows::Forms::DataFormats::FileDrop)という呼び出しがあります。
よって、この^という記号がついた型の変数にアクセスするには、->を使うと良さそうと推測できます。
今回のfilesは81行目でarray<String^>^filesと宣言されているので、
89行目を *s=files->c_str();とするとうまくいく「かもしれない」と推測できます。
もちろん推測なので間違っているかもしれません。
80行目にe->Data->GetDataPresent(::System::Windows::Forms::DataFormats::FileDrop)という呼び出しがあります。
よって、この^という記号がついた型の変数にアクセスするには、->を使うと良さそうと推測できます。
今回のfilesは81行目でarray<String^>^filesと宣言されているので、
89行目を *s=files->c_str();とするとうまくいく「かもしれない」と推測できます。
もちろん推測なので間違っているかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: string型からの変換 .c_str() について
c_str()ではなく、こっちの方法を使う方がいいかもしれません。
方法: System::String を wchar_t* または char* に変換する
方法: System::String を wchar_t* または char* に変換する
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: string型からの変換 .c_str() について
C++/CLIでやるならば,<stdio.h>系を使うのではなく,System::IO系を使います。
そもそも,std::stringではなく,System::Stringですし。
そもそも,std::stringではなく,System::Stringですし。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: string型からの変換 .c_str() について
ちゃぶ台返しで申し訳ないのですが。
CLRフォームは一見簡単に見えますが、言語C++/CLIをよく理解して使わないとカオスになります。
ただでさえ難しいC++を更に拡張したC++/CLIは非常に難易度が高いのです。
なので、余程の事情がない限りは初心者にも中級者にもオススメできません。上級者向けです。
今後発展する可能性もないので、よほどの事情でも無い限り初心者があえてやる必要はないと思います。
CLRフォームは一見簡単に見えますが、言語C++/CLIをよく理解して使わないとカオスになります。
ただでさえ難しいC++を更に拡張したC++/CLIは非常に難易度が高いのです。
なので、余程の事情がない限りは初心者にも中級者にもオススメできません。上級者向けです。
今後発展する可能性もないので、よほどの事情でも無い限り初心者があえてやる必要はないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: string型からの変換 .c_str() について
混乱してきました…
早い話がVisual Studio c++で Windowsフォームアプリケーションを作るのは初心者には無理ってことでしょうか?
(作れるようなら初心者とは呼べない、的な意味で)
そもそもの目的は、ドラッグ&ドロップしたビットマップファイルを決まった法則通りに書き換えてくれるソフトを作ることなんですが
何を勉強すればいいんでしょう?
早い話がVisual Studio c++で Windowsフォームアプリケーションを作るのは初心者には無理ってことでしょうか?
(作れるようなら初心者とは呼べない、的な意味で)
そもそもの目的は、ドラッグ&ドロップしたビットマップファイルを決まった法則通りに書き換えてくれるソフトを作ることなんですが
何を勉強すればいいんでしょう?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: string型からの変換 .c_str() について
C++である必要がないなら、C#を検討しましょう。
C++でないとマズイなら、C言語の知識で扱えるWindowsAPIを検討する(面倒ですけどね)。
あるいは、これもレガシーですがVisual Studio Community 2013で無料利用できるようなったMFCでしたらC++の知識の範囲で利用できます。
将来的にC++/CLIのCLRフォームは幅広く使われないと思いますので覚えてもあまり将来性はありません。
だからと言ってMFCも不明なんですけどね。
【補足】
マイクロソフトのブレ幅が問題なんですよ。
これからの時代は.NETだと言ってC++/CLIを開発しておいて、Windows8になったらメトロUIのストアアプリで.NETは使えないよ。と来たんです。
Windows8になったらメトロUIのストアアプリにはC++/CXって仕組みが使われます。
もう、訳が分かりませんよね。
このブログが参考になるかと。
「[win8] C++/CLI と C++/CX の違い | Moonmile Solutions Blog」
http://www.moonmile.net/blog/archives/3401
マイクロソフトとしては新しいデスクトップのアプリはC#で作って欲しいんだと思います。
C++でないとマズイなら、C言語の知識で扱えるWindowsAPIを検討する(面倒ですけどね)。
あるいは、これもレガシーですがVisual Studio Community 2013で無料利用できるようなったMFCでしたらC++の知識の範囲で利用できます。
将来的にC++/CLIのCLRフォームは幅広く使われないと思いますので覚えてもあまり将来性はありません。
だからと言ってMFCも不明なんですけどね。
【補足】
マイクロソフトのブレ幅が問題なんですよ。
これからの時代は.NETだと言ってC++/CLIを開発しておいて、Windows8になったらメトロUIのストアアプリで.NETは使えないよ。と来たんです。
Windows8になったらメトロUIのストアアプリにはC++/CXって仕組みが使われます。
もう、訳が分かりませんよね。
このブログが参考になるかと。
「[win8] C++/CLI と C++/CX の違い | Moonmile Solutions Blog」
http://www.moonmile.net/blog/archives/3401
マイクロソフトとしては新しいデスクトップのアプリはC#で作って欲しいんだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: string型からの変換 .c_str() について
色々とアドバイスありがとうございます。
やるべきことが分かったので一応解決としてトピックを閉めさせていただきます。
やるべきことが分かったので一応解決としてトピックを閉めさせていただきます。