配列処理 – プログラミング – Home

通知
すべてクリア

[解決済] 配列処理


南
 南
(@南)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

こんばんは。
以前にも同じような質問があったので引用した部分もあるのですが
112345678901
113456789012
このファイルを読み込んで最初の11を飛ばして次の5桁ずつ読み込んで
23456 78901
34567 89012
このようにVIEWに表示させたいと考えています。

以下のようなソースを作ってみたんですが
文字 '0x81' は認識できません
というエラーが出てしまい、うまくいきません。

よろしくお願いします。

CStdioFile fp(ファイル名,CFile::modeRead);
char buf[12],bufa[10],bufb[10];

while (fp.ReadString(buf,12)!=NULL){

   for(int i=0,j=2;i<10,j<12;i++,j++){
     bufa[i]=buf[j];
     bufa[10]='\0';
   }

   for(i=0;i<10;i++){
     bufb[j++]=bufa[i];
     if (j>= 5){
      bufb[j]='\0';
      pDC->TextOut(0,(int n++)*20,bufb,strlen(bufb));
      j=0; 
     }
   }
}


引用未解決
トピックタグ
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

ソースの中に全角のスペースが入っています。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

bufa[10]で宣言しているのに、
>bufa[10]='\0';
こんなことしてはいけません。

そもそも、12とか10みたいに数字そのものを書くと後々苦労することになりかねませんよ。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

ん?
forの条件式にカンマ演算子を入れたらどうなるんだろう。
ちゃんと終わるんでしょうか?
・・・・・
やってみたら、いちおうちゃんとループは終わりました。
ですが、一番最後だけが終了条件になります。

for( i=0; FALSE, i<10, TRUE; i++ )

こんなん書くと無限ループになります。


返信引用
南
 南
(@南)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

kazumaさんEIJIさん、ありがとうございます。
それぞれのご指摘、たいへん参考になりました

とりあえず、一回目のfor文までの動作は確認済みなんです。
うまく11を飛ばして読み込んでbufaに入りました。

5桁読み込むif文で何か問題があるのではないかと試行錯誤しています。

なにとぞ、よろしくお願いします。


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

if文、for文でごちゃごちゃやっても人それぞれかも知れないですけど、私なら

CStdioFile fp(ファイル名,CFile::modeRead);
char buf[20], buf2[20];

while(fp.ReadString(buf, sizeof(buf)) != NULL){
memset(buf2, 0, sizeof(buf2));
strncpy(buf2, &buf[2], 5);
strcat(buf2, );
strcat(buf2, &buf[7]);
AfxMessageBox(buf2);
}

こうしますかね。もう少し汎用的に書くなら

const int START = 2, LEN1 = 5, LEN2 = 5;
const char SPACE[] = ;

CStdioFile fp(ファイル名,CFile::modeRead);
char buf[START + LEN1 + LEN2 + 1], buf2[LEN1 + LEN2 + sizeof(SPACE)];

while (fp.ReadString(buf,sizeof(buf))!=NULL){
memset(buf2, 0, sizeof(buf2));
strncpy(buf2, &buf[START], LEN1);
strcat(buf2, SPACE);
strcat(buf2, &buf[START + LEN1]);
AfxMessageBox(buf2);
}

とか。
TextOutではなく、AfxMessageBoxにしてます。


返信引用
南
 南
(@南)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

CdSさん、返事ありがとうございます。
このような方法があるとは、驚きです。

今回は、10文字程度で考えてもらったんですけど、
100文字1000文字といった大きな数を扱うとしたら、
このような方法でも、可能なのでしょうか?
for文を使うことになるのでしょうか?


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

何MBとかいう単位になってくると、スタックが問題になってくるでしょうけど、100とか1000とかだったら
何の問題もないでしょう。
そのために汎用的なソースも載せておきました。
START, LEN1, LEN2, SPACEを変えればそれ以下のソースは変更する必要は基本的にないはず。

>そもそも、12とか10みたいに数字そのものを書くと後々苦労することになりかねませんよ。
とEIJIさんがご指摘のとおり、こういったソースの記述を心掛けてください。
forを使ったとしてもです。
仕様変更に柔軟に対応するためです。


返信引用
南
 南
(@南)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

kazumaさん、EIJIさん、CdSさんのお三方、有難うございました。

何とかなりそうです。

これからもお世話になると思うので、よろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました