いま、Visual C++ 2008 Express Editionで、コマンドボタンをクリックした時に、600kバイト程度のバイナリファイルから特定の番地のデータを抜き出して(2バイト分)、そのデータをテキストデータに変換してテキストボックスに表示させたいのですが、コードを作成したのですが、エラーがたくさんでて書き方がよくわかりません。

一応コマンドボタンのところはこのように書きました。まだ、ファイルを読み込むまで行っていません。


private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
  //指定したファイル名でStreamReaderを設定する

  try{
      sreader1=gcnew StreamReader("sample.txt");
  }catch(Exception^ ex){
      //Console::WriteLine(ex->Message);
      return 0;
  }
this->textBox1->Text = L"変更1";
  this->textBox2->Text = L"変更2";
this->textBox3->Text = L"変更3";
}
};

どうかご教授いただきますようよろしくお願い致します。

「Visual C++ 2008 Expr」の質問画像

A 回答 (2件)

 こんばんは。

こう言う事でしょうか。

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
//指定したファイル名でStreamReaderを設定する
try
{
System::IO::StreamReader^ sr = gcnew System::IO::StreamReader(_T("sample.txt"));
//受け皿
array<wchar_t>^ buf = gcnew array<wchar_t>(2);

//先頭から0x1f63バイト動かす
sr->BaseStream->Seek(0x1f63, System::IO::SeekOrigin::Begin);

//2バイト読み込む
sr->Read(buf, 0, buf->Length);

//此処でテキストボックスに入れる
this->textBox1->Text = gcnew System::String(buf);
}
catch(System::Exception^ ex)
{
System::Windows::Forms::MessageBox::Show(ex->ToString());
}

//this->textBox1->Text = L"変更1";
this->textBox2->Text = L"変更2";
this->textBox3->Text = L"変更3";
}
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

教えていただいたコーディングでVisual C++ 2008 Express Editionでコンパイルかけてやっています。ただ、ちょっとエラーが数個出てきてその内容が理解できない状態です。

下のページにそのエラー内容が表示されているところの絵を貼り付けてみました。
http://sourceforge.jp/projects/felicareader/wiki …

どなたかもしよければ、何が悪く、どう解消したらよいか教えていただけませんでしょうか。

また、このC++プロジェクトは下のURLからダウンロードすることもできます。
http://svn.sourceforge.jp/view/RungeKutta/RungeK …

お礼日時:2009/05/25 14:33

 こんにちは。

補足頂きました。HPとエラー内容の方を拝見させて頂きました。
 この手のエラーは文字列以外の部分で、「全角文字」を使用しているのが原因です。
 form1.hの中の

System::IO::StreamReader^ sr = gcnew System::IO::StreamReader(_T("sample.txt"));

 の左側の空白部分に、「全角スペース」が混ざり込んでいるのが原因ではないでしょうか。ひとまず、バックスペースで、空白を消してみて下さい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

本当にありがとうございます!!エラーが22もありましたが、1にまで減りました。とりあえず自力でやってみたいと思います。

お礼日時:2009/05/25 18:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QString^の^自体が何を意味しているのか、わかりません。

String^ msg = "テスト";
は、
char msg[] = "テスト";
と同じ意味でしょうか?

String^の^自体が何を意味しているのか、わかりません。
TurboCからC言語は殆ど使っていませんので、戸惑っています。

VS2005を覚えようとしているのですが、なかなか取っ付きにくいです。
意識改革できる参考書などご存知の方も教えてください。

Aベストアンサー

簡単にいうと^(ハットマーク)は実体がヒープに確保されるという意味です。

他の方の指摘の通り、これはC++/CLIと呼ばれる言語でC++で.NET Frameworkを
利用するために拡張した言語です。
.NET Frameworkのクラスはガベージコレクションで管理されている為
C++のクラスとは別に管理する必要があります。その為
^(ハットマーク)をつける事により区別しています。

ちなみにC++マネージ拡張とC++/CLIは違います。
2003以前の仕様をC++マネージ拡張と言い
2005以降のものをC++/CLIと言います。

System::Stringはスタックに置くことは出来ないので
System::String^ msg;
となります。

System::Drawing::Color等は
スタックに置くこともヒープに置くことも可能です。
System::Drawing::Color^ col1 = gcnew System::Drawing::Color();
System::Drawing::Color col2;
int test1 = col1->R;
int test2 = col2.R;

C++/CLIの参考書としては
中 博俊著 「実践 C++/CLI 極めるための基礎と実用テクニック」
がありますが、
まずC/C++を理解していることが前提になっていますので
もしC/C++の理解に不安があるようなら先に勉強した方が良いでしょう。
有名な書籍だと「独習C」と「独習C++」があります。

前述の通りC++/CLIは.NET Frameworkを使うためのものですが
.NET Frameworkを使いたいのであればC#の方が良いと思います。

簡単にいうと^(ハットマーク)は実体がヒープに確保されるという意味です。

他の方の指摘の通り、これはC++/CLIと呼ばれる言語でC++で.NET Frameworkを
利用するために拡張した言語です。
.NET Frameworkのクラスはガベージコレクションで管理されている為
C++のクラスとは別に管理する必要があります。その為
^(ハットマーク)をつける事により区別しています。

ちなみにC++マネージ拡張とC++/CLIは違います。
2003以前の仕様をC++マネージ拡張と言い
2005以降のものをC++/CLIと言います。

Syst...続きを読む

Q【C++/CLI】String型文字列の位置を指定して値を取り出す

VC++2005、.NET2.0、C++/CLIにてWindowsアプリを作成しています。

String型に格納された文字列の、位置を指定して値を取り出すには、
どのような方法を用いればよいのでしょうか?
基本的な質問で申し訳ありませんが、ご教示よろしくお願い致します。

例)
String^ st = "abあいcde";
//四番目の値を取り出す⇒「い」を取り出す

Aベストアンサー

こうですか?

String^ st = "abあいcde";
String^ st2 = st->Substring(3, 1);

あとこんな方法も・・・
String^ st = "abあいcde";
array<wchar_t>^ ary = st->ToCharArray();
wchar_t ch = ary[3];

Qchar型配列をString型にしたい

 VC++2005ExpressEdition + PlatformSDKを使用しています.

 char型配列をString型にしたいと思っています(MessageBoxで表示するため).

 int型ならば,
> String^ out = String::Format("{0}", i );
> MessageBox::Show(out);
などとできます.

 下のアドレス(*1)のNo.2の答えにあるように
> char ss[256];
> String^ out;
> out=ss;
とすると
> error C2440: '=' : 'char [128]' から 'System::String ^' に変換できません。
なるエラーが出ます(S を大文字にしたりハットを付けたりしています).

 char型の配列のString型への変換はどのようにすればいいのでしょうか.

(*1)http://oshiete1.goo.ne.jp/kotaeru.php3?q=479640

Aベストアンサー

試してないですが、
String^ out = gcnew String(ss);
でいけませんか

QVisualC++ テキストファイルなどの取り込み方

現在、Visual C++ 2008 Express Editionを使って
入門書の「ファイルの入出力」部分を勉強中です。

そこで、読み込むべきテキストファイルを作成したまではいいのですが
プロジェクトにそのファイルを追加する方法がわからずに困っています。

プロジェクト名がサンプルの場合
Visual Studio 2008\Projects\サンプル\サンプル
のディレクトリにファイルをコピーすれば
問題なくファイルを読み込むことはできました。

しかし、毎度毎度自分でコピーするのは手間がかかるので
Visual C++のソフト上からファイルを追加したいのですが
それにはどうしたらよいでしょうか。
教えてください。

Aベストアンサー

(Visual C++ 2008 Express Edition を使ったことがないのですが・・)

>プロジェクトにそのファイルを追加する方法がわからずに困っています。

 ・「プロジェクトにそのファイルを追加」する必要はないと思います。

>ソースコードで指定した名前のテキストさえ読み込むことができればできればよいのですが。

☆フルパスでテキストファイルを指定すれば・・。

 例) fp = fopen( "D:\\Work\\Data\\sample.txt", "r" );

 ここで注意するのは、\ がエスケープ文字であることから、\\ と書きます。

 ・フルパス
 ・エスケープ文字   でそれぞれ検索しご確認下さい。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

QCStringからchar*への型変換について教えてください。

以前の質問に

int型 → CString型/char型

がありましたが、

CString型をchar*型に変換する方法を
教えていただければありがたいです。

MSDNで「LPCTSTRキャスト」が説明されていましたが、
例が載ってないのでよくわかりませんでした。

よろしくお願いします。

Aベストアンサー

目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。
char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。

直接CString内の文字列を扱う必要があるならCString::operator LPCTSTRで文字列ポインタが得られます。
ただし、CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。

MSDNのMicrosoft Foundation Classリファレンス→CString→クラスメンバで確認してください。

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報