配列処理

[戻る]
2002/01/11(金) 19:32:08
こんばんは。
以前にも同じような質問があったので引用した部分もあるのですが
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 2002/01/11(金) 19:37:04
ソースの中に全角のスペースが入っています。

EIJI 2002/01/11(金) 20:07:58
bufa[10]で宣言しているのに、
>bufa[10]='\0';
こんなことしてはいけません。

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

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

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

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

2002/01/11(金) 20:45:59
kazumaさんEIJIさん、ありがとうございます。
それぞれのご指摘、たいへん参考になりました

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

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

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

CdS 2002/01/11(金) 21:06:05
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にしてます。

2002/01/11(金) 22:23:45
CdSさん、返事ありがとうございます。
このような方法があるとは、驚きです。

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

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

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

2002/01/12(土) 18:08:22
[[解決]]
kazumaさん、EIJIさん、CdSさんのお三方、有難うございました。

何とかなりそうです。

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

古いスレッドには追加発言できません。