回答受付中の質問

質問No.4376086
すぐに回答を!
すぐに回答を!
お気に入り投稿に追加する (0人が追加しました)
回答数8
閲覧数1250
Cで文字列の分割
ある文字列を5文字ずつ抜き出だすC言語のプログラムを作りたいのですが,
なかなか苦戦しています.
どなたかご教授頂けるとたすかります.

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

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

1メッシュが整数値5文字で表されており,それが1000個横に並んでいます.全てのメッシュの間にスペースがあれば楽なのですが,それがない時もあります・・・
よろしくお願いします.
投稿日時 - 2008-10-04 02:24:13
あなたの言葉で、相談者さんの悩みを解決しませんか?
OKWaveではみんなのありがとうの輪を広げています!

回答 (8)

回答No.8
>国土地理院発行の火山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 );
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。
投稿日時 - 2008-10-04 10:50:54
この回答を支持する
(現在0人が支持しています)
回答No.7
文字数で取得しないといけないようです
火山の標高データを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;
}
投稿日時 - 2008-10-04 10:23:10
この回答を支持する
(現在0人が支持しています)
回答No.6
 
>5文字は無視して数値が空白か-記号のみで区切られていると保証されているなら

 残念ながら、

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

です。
投稿日時 - 2008-10-04 09:56:11
この回答を支持する
(現在0人が支持しています)
回答No.5
> ある文字列を5文字ずつ抜き出だす

という仕様からすると、結果は文字列でないとまずいのではないだろうか。
もし結果は整数値であるとすると、#3でsscanf()した結果を直接int型の配列に入れてしまえばよい。
投稿日時 - 2008-10-04 09:06:07
この回答を支持する
(現在0人が支持しています)
回答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");
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;
}
投稿日時 - 2008-10-04 08:40:12
この回答を支持する
(現在0人が支持しています)
8件中 1~5件目を表示
この質問は役に立ちましたか?
3人が「このQ&Aが役に立った」と投票しています
もっと聞いてみる

関連するQ&A

  • question

    メッシメッシ こんにちは バルサのメッシはシステムにもよりますが どのポジションが最適だと思いますか...

  • question

    メッシバルセロナのメッシはスペイン国籍を取得したそうですが、なんでアルゼンチン代表で出てるの・・? ...

  • question

    エラーコード1231・・・ウィルスバスターとESETスマートセキュリティを誤って同時にインストールしてしまったら インタ...

  • question

    メッシとメッシと C ロナウドって どっちが強いのでしょうか? あと歴史上ですごい選手がいれば おし...

  • question

    マラドーナとメッシマラドーナよりメッシが優れているまた、メッシよりマラドーナが優れている所を何点かお願いします。...

  • question

    メッシってさ・・・スナフキンに似てませんか?? サッカー選手のメッシとムーミンのスナフキン ...

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

関連するガイド記事

    回答募集中

    同じカテゴリの人気Q&Aランキング

    カテゴリ
    C・C++
    -PR-

    OKWaveのおすすめ情報

    特集

    このQ&Aの関連キーワード

    同じカテゴリの人気Q&Aランキング

    カテゴリ
    C・C++
    -PR-

    回答のついた最新のQ&A

    ピックアップ

    -PR-
    -PR-