@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ファイル内容によって配列長を変更したい

1
投稿者投稿内容
chima
会議室デビュー日: 2009/01/18
投稿数: 3
投稿日時: 2009-01-18 19:25
初めまして。卒業研究でVisual C++ 2005のC++/CLIでプログラム作成しています。
プログラムはC++も.NETも知識がない状態(Cのみ)で始めたので、
最近になってやっと理解してきたところです。
今はCのプログラムをCLIで作成したWindowsアプリケーションに組み込みたく、
マネージコードとネイティブコードの混在したプログラムの作成に奮闘しています。
誰も聞く相手がいなく、ほぼ独学状態ですので、度々ここにお邪魔させていただくと思いますので、
どうかよろしくお願いします。

今作成しているものの流れは、「CSVファイルから内容を読み込み、カンマ区切りで配列に格納し、
Cプログラムで使用する為にint型の配列にコピーする」です。
ファイル内容は
コード:
	1,7,3,2,1,7,8,7,8,4,2
	1,3,8,7,6,0,6,8,7,4,6
	4,6,1,3,5,7,8,1,9,7,6


のようになっています。
以下に示すコードのdefineを使わずにファイル内容によって配列長を変えたいと思っています。
コード:
#include<string>  
#include<vcclr.h> 

#define Y 2  
#define X 3  

using namespace System;
using namespace System::IO;

int main(void){
  int data[Y][X];
  int x,y;

try{
    //ファイルオープン
    FileStream^ fs = gcnew FileStream("hoge.csv", FileMode::Open);
    StreamReader^ sr = gcnew StreamReader(fs);
    int x, y;
    char *str[X][128];//カンマ区切りで保存

    for(y=0;;y++){
      String^ line = sr->ReadLine();

      if(line == nullptr) break;

      char tmp[128];
      sprintf(tmp,"%s",line);       //変数コピー

      //カンマ区切り
      for(x=0;x<X;x++){
        if(x==0) str[y][x]=strtok(tmp,",");
        else     str[y][x]=strtok(nullptr,",");
      }

      //int型に変換
      for(x=0;x<X;x++){ data[y][x]=atoi(str[y][x]); }
    }

    //ファイルのクローズ
    sr->Close();

  //例外処理
  }catch(System::Exception^ pe){
    Console::WriteLine(pe->ToString());

    //例外オブジェクトの削除
    delete pe;
  }

 //データ表示
  printf_s("<int型> data配列の表示\\n");
  for(y=0;y<Y;y++){
    for(x=0;x<X;x++){
      printf_s("data[%d][%d]=%d\\t",y,x,data[y][x]);
    }
    printf_s("\\n");
  }

  return 0;
}


読み込んだファイルをマネージ配列に格納し、配列長を取得、そしてネイティブ配列に変換。
など、自分で色々と試したのですが、訳が分からなくなってしまったので、
皆さんのお力をお借りしようと思ったしだいです。。
説明不足で分かりにくいと思われますので、ご指摘お願いします。
また、この他にいい方法ございましたら教えてください。
どうかよろしくお願いします。
chima
会議室デビュー日: 2009/01/18
投稿数: 3
投稿日時: 2009-01-18 22:06
すみません、他サイトにて回答を得ることができました。
CSV形式ではなくtxtなのですが、これで進めます。
お騒がせすみません。
ありがとうございました。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2009-01-19 06:30
自分は C++/CLI は専門外なので回答はできなかったですが。
引用:

chimaさんの書き込み (2009-01-18 22:06) より:

すみません、他サイトにて回答を得ることができました。
CSV形式ではなくtxtなのですが、これで進めます。
お騒がせすみません。
ありがとうございました。


その「他サイト」の URL を示していただくことはできませんか?
chima さんの行為は「マルチポスト」と言って、あまり推奨されるものではありませんです。
http://www.ippo.ne.jp/g/53.html
chima
会議室デビュー日: 2009/01/18
投稿数: 3
投稿日時: 2009-01-19 09:03
引用:

ぽぴ王子さんの書き込み (2009-01-19 06:30) より:
その「他サイト」の URL を示していただくことはできませんか?
chima さんの行為は「マルチポスト」と言って、あまり推奨されるものではありませんです。
http://www.ippo.ne.jp/g/53.html



ご指摘ありがとうございました。
二重投稿は良くないと分かってはいたのですが、
あまりにも焦っていたために皆さんに失礼なことをしてしまったと反省しています。
回答得たURLを載せておきます。

[C++/CLI]マネージコードで配列を作成してネイティブコードの配列にコピーしたい
http://okwave.jp/qa4637953.html

この度は大変申し訳ありませんでした。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2009-01-19 10:35
中途半端にstrtokやatoiとかが混ざっているのが許せないけど。
# strtok(nullptr,",");は間違いだと思うし。

>sprintf(tmp,"%s",line); //変数コピー
このやり方で間違いない?
sprintfのマニュアルにString^に%sを指定すると記述されていない以上危険だと思うけど。

他の変換方法→http://forums.microsoft.com/msdn-ja/showpost.aspx?postid=818937&siteid=7

そもそもstrtokを使わず、String::Splitを使って分割し、
atoiはint::TryParse(int:arseもしくはConvert::ToInt32あたり)を使う。
1

スキルアップ/キャリアアップ(JOB@IT)