-PR-
kuronastu

ある文字列を5文字ずつ抜き出だすC言語のプログラムを作りたいのですが,
なかなか苦戦しています.
どなたかご教授頂けるとたすかります.

ちなみに,使っているデータ国土地理院発行の火山10mメッシュデータで,こんな感じです・・・

-9999-9999-9999-9999 1255 1259 1257 1252 1245 1238 1231 1224 1218

1メッシュが整数値5文字で表されており,それが1000個横に並んでいます.全てのメッシュの間にスペースがあれば楽なのですが,それがない時もあります・・・
よろしくお願いします.
  • 回答数8
  • 気になる数0
  • Aみんなの回答(全8件)

    回答 (全8件)

    • 2008-10-04 08:27:26
    • 回答No.3
    当該データのフォーマットが絶対に崩れないのであれば、 #include <stdio.h> int main(void) { char s[] = "-9999-9999-9999-9999 1255 1259 1257 1252 1245 1238 1231 1224 1218"; char str[1000][6], *p = s; int n, i ...続きを読む
    当該データのフォーマットが絶対に崩れないのであれば、

    #include <stdio.h>

    int main(void)
    {
    char s[] = "-9999-9999-9999-9999 1255 1259 1257 1252 1245 1238 1231 1224 1218";
    char str[1000][6], *p = s;
    int n, i;

    for (i = 0; i < 1000 && *p; i++, p += 5) {
    if (sscanf(p, "%5d", &n) == 1) {
    sprintf(str[i], "%5d", n);
    printf("'%5s'\n", str[i]);
    }
    }
    return 0;
    }
    • ありがとう数0
    • 2008-10-04 05:56:59
    • 回答No.2
       この方がいいのかな? #include <stdio.h> #include <ctype.h> #define MAX 20 int Split(FILE *fp, char table[][6], int n) { int c, i = 0, j = 0; while((c = fgetc(fp)) != EOF){ if(isdigit ...続きを読む
     
     この方がいいのかな?

    #include <stdio.h>
    #include <ctype.h>

    #define MAX 20

    int Split(FILE *fp, char table[][6], int n)
    {
    int c, i = 0, j = 0;

    while((c = fgetc(fp)) != EOF){
    if(isdigit(c)){
    table[i][j] = c;
    table[i][++ j] = '\0';
    j %= 5;
    if((i += !j) >= n) break;
    }
    }
    if(i < n) table[i][0] = '\0';
    return i;
    }

    int main(void)
    {
    FILE *fp = fopen("test.dat", "r");
    char table[MAX][6];
    int i, j;

    if(!fp) return 1;
    j = Split(fp, table, MAX);
    for(i = 0; i < MAX && table[i][0]; ++ i) puts(table[i]);
    printf("(DATA : %d)\n", j);
    fclose(fp);
    return 0;
    }
     
    "test.dat"
    -99999-9999999999-99999 12355 1235912357 12352 12345 12338123311232412318
     
    • ありがとう数0
    • 2008-10-04 03:13:05
    • 回答No.1
    #include <stdio.h> #include <ctype.h> #include <string.h> #define MAX 20 int Split(char *str, char table[][6], int n) { char *p = str + strlen(str); int i; for(i = 0; i < ...続きを読む
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>

    #define MAX 20

    int Split(char *str, char table[][6], int n)
    {
    char *p = str + strlen(str);
    int i;

    for(i = 0; i < n && str < p; i ++){
    while(!isdigit(*str)) str ++;
    sprintf(table[i], "%.5s", str);
    str += 5;
    }
    if(i < n) table[i][0] = '\0';
    return i;
    }

    int main(void)
    {
    char *str = "-99999-99999-99999-99999 1235512359 1235712352 12345 12338123311232412318";
    char table[MAX][6];
    int i, j;

    puts(str);
    j = Split(str, table, MAX);
    for(i = 0; i < MAX && table[i][0]; i ++) puts(table[i]);
    printf("(DATA : %d)\n", j);
    return 0;
    }
    • ありがとう数0
    • 2008-10-04 08:40:12
    • 回答No.4
    5文字は無視して数値が空白か-記号のみで区切られていると保証されているなら #include <stdio.h> #define MAX_DATA 1000 int mesh_data[MAX_DATA]; int main(void) { FILE* fp; int i = 0; fp = fopen("test.txt", "r&q ...続きを読む
    5文字は無視して数値が空白か-記号のみで区切られていると保証されているなら
    #include <stdio.h>
    #define MAX_DATA 1000

    int mesh_data[MAX_DATA];

    int main(void)
    {
    FILE* fp;
    int i = 0;

    fp = fopen("test.txt", "r");
    if (!fp) {
    printf("file open error\n");
    return 0;
    }
    while (!feof(fp)) {
    fscanf(fp, "%d", &mesh_data[i]);
    printf("%d\n", mesh_data[i]);
    if (++i >= MAX_DATA) {
    break;
    }
    }
    fclose(fp);
    return 0;
    }
    • ありがとう数0
    • 2008-10-04 09:06:07
    • 回答No.5
    > ある文字列を5文字ずつ抜き出だす という仕様からすると、結果は文字列でないとまずいのではないだろうか。 もし結果は整数値であるとすると、#3でsscanf()した結果を直接int型の配列に入れてしまえばよい。
    > ある文字列を5文字ずつ抜き出だす

    という仕様からすると、結果は文字列でないとまずいのではないだろうか。
    もし結果は整数値であるとすると、#3でsscanf()した結果を直接int型の配列に入れてしまえばよい。
    • ありがとう数0
    • 2008-10-04 10:23:10
    • 回答No.7
    文字数で取得しないといけないようです 火山の標高データを10cm単位の数値で表しているようです 1000mの場合 10000 100mの場合 1000 となるので 100m,1000m,100m のデータは _100010000_1000 となるようです # _ はブランク(空白) # Fortranで出力しているようです 当方のサンプル #define MAXARRAY ...続きを読む
    文字数で取得しないといけないようです
    火山の標高データを10cm単位の数値で表しているようです

    1000mの場合 10000
    100mの場合 1000
    となるので
    100m,1000m,100m のデータは _100010000_1000 となるようです
    # _ はブランク(空白)
    # Fortranで出力しているようです

    当方のサンプル
    #define MAXARRAY 1000

    /// GetData
    /// pSrc : 分割文字列
    /// nStep : 分割文字数
    /// pDest : 分割文字列格納配列
    /// nMax : 分割文字列格納配列の最大値
    int GetData( char* pSrc, int nStep, char* pDest[], size_t nMax )
    {
      size_t n, nCnt, nLen;
      char buf[32], *p = NULL;
      nCnt = ( nLen = strlen( pSrc ) ) / nStep;
      if ( nCnt > nMax ) nCnt = nMax;
      nCount = 0;
      // %.5s を生成
      sprintf( buf, "%%.%ds", nStep );
      for( n = 0; n < nCnt; n++ ) {
        sprintf( pDest[n], buf, &pSrc[ n * nStep ] );
        // 先行スペースの削除
        p = pDest[n];
        while( *p == ' ' )
          p++;
        if ( p != pDest[n] ) {
          sprintf( pDest[n], "%s", p );
        }
      }
      return nCnt;
    }

    int main(int argc, _TCHAR* argv[])
    {
      char chSrc[] = {"-9999-9999-9999-9999 1255 1259"
        " 1257 1252 1245 1238 1231 1224 1218"};
      char chDest[MAXARRAY][6];
      char* p1[MAXARRAY];
      int nCnt, n;

      memset( chDest, 0, sizeof( chDest ) );
      for( n = 0; n < MAXARRAY; n++ ) {
        p1[n] = chDest[n];
      }

      nCnt = GetData( chSrc, 5, p1, 1000 );
      for( n = 0; n < nCnt; n++ ) {
        printf( "%3d:%s\n", n, chDest[n] );
      }

      return 0;
    }
    • ありがとう数0
    • 2008-10-04 09:56:11
    • 回答No.6
      >5文字は無視して数値が空白か-記号のみで区切られていると保証されているなら  残念ながら、 >全てのメッシュの間にスペースがあれば楽なのですが,それがない時もあります・・・ です。
     
    >5文字は無視して数値が空白か-記号のみで区切られていると保証されているなら

     残念ながら、

    >全てのメッシュの間にスペースがあれば楽なのですが,それがない時もあります・・・

    です。
    • ありがとう数0
    • 2008-10-04 10:50:54
    • 回答No.8
    >国土地理院発行の火山10mメッシュデータ  国土地理院発行の「テキスト」データは、FORTRAN言語の書式仕様で作られていますよね。    Cで、これに相当する書式を探せばよいかと。      I5 → %5d    http://www.k-cube.co.jp/wakaba/server/format.html >1メッシュが整数値5文字で表されており,それが1000個横に ...続きを読む
    >国土地理院発行の火山10mメッシュデータ

     国土地理院発行の「テキスト」データは、FORTRAN言語の書式仕様で作られていますよね。
     
     Cで、これに相当する書式を探せばよいかと。
     
       I5 → %5d

       http://www.k-cube.co.jp/wakaba/server/format.html

    >1メッシュが整数値5文字で表されており,それが1000個横に並んでいます.

     若干手を加えられ、独自仕様にされたのかな?。

     ソースを投稿します。仕様、レコード数に合わせてお試し下さい。
     (BorlandC++5.6.4)

    蛇足
     10cm単位の整数位ですので、データの格納に short は無理です。
     (読み込みは現状の int で(-9999 を 0 とし) unsigned short にキャストすれば、富士山も可能)

    #include <stdio.h>

    int  main()
    {
      FILE  *fp;
      int  iSpace, iRecNo, iRaw, iCnt;
      int  iVal[ 20 ][ 1000 ];  // 20レコード分

      fp = fopen( "Z:\\Mesh.lem", "r" );

      if( NULL == fp )return( -9 );

      while( 1 == fscanf( fp,"%6d", &iSpace ) ){  // 空き容量

        fscanf( fp,"%4d", &iRecNo );  // レコード番号

        printf( "%6d %4d\n", iSpace, iRecNo );

        iCnt = 0;

        while( 1 == fscanf( fp,"%5d", &iRaw ) ){

          iVal[ iRecNo ][ iCnt++ ] = iRaw;

          if( 1000 <= iCnt )  break;// 次のレコードへ
        }
      }
      fclose( fp );

    //  処理

      return( 0 );
    }
    注:インデントに全角空白を用いています。タブに一括変換して下さい。
    • ありがとう数0
    • 回答数8
    • 気になる数0
    • ありがとう数3
    • ありがとう
    • なるほど、役に立ったなど
      感じた思いを「ありがとう」で
      伝えてください
    • 質問する
    • 知りたいこと、悩んでいることを
      投稿してみましょう
    こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
    このQ&Aにはまだコメントがありません。
    あなたの思ったこと、知っていることをここにコメントしてみましょう。

    関連するQ&A

    -PR-
    -PR-

    その他の関連するQ&Aをキーワードで探す

    別のキーワードで再検索する
    -PR-
    -PR-
    -PR-

    特集


    成功のポイントとは?M&Aで経営の不安を解決!

    -PR-

    ピックアップ

    -PR-
    ページ先頭へ