総ありがとう数 累計4,380万(2015年3月3日現在)

【新企画】原発再稼働について質問募集中!
-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(0-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(0-0)
  • ありがとう数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(0-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(0-0)
  • ありがとう数0
なるほど、役に立ったなど
感じた思いを「ありがとう」で
伝えてください
  • 2008-10-04 09:06:07
  • 回答No.5
> ある文字列を5文字ずつ抜き出だす という仕様からすると、結果は文字列でないとまずいのではないだろうか。 もし結果は整数値であるとすると、#3でsscanf()した結果を直接int型の配列に入れてしまえばよい。
> ある文字列を5文字ずつ抜き出だす

という仕様からすると、結果は文字列でないとまずいのではないだろうか。
もし結果は整数値であるとすると、#3でsscanf()した結果を直接int型の配列に入れてしまえばよい。
  • 同意数0(0-0)
  • ありがとう数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(0-0)
  • ありがとう数0
なるほど、役に立ったなど
感じた思いを「ありがとう」で
伝えてください
  • 2008-10-04 09:56:11
  • 回答No.6
  >5文字は無視して数値が空白か-記号のみで区切られていると保証されているなら  残念ながら、 >全てのメッシュの間にスペースがあれば楽なのですが,それがない時もあります・・・ です。
 
>5文字は無視して数値が空白か-記号のみで区切られていると保証されているなら

 残念ながら、

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

です。
  • 同意数0(0-0)
  • ありがとう数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(0-0)
  • ありがとう数0
なるほど、役に立ったなど
感じた思いを「ありがとう」で
伝えてください
  • 回答数8
  • 気になる数0
  • ありがとう数3
  • ありがとう
  • なるほど、役に立ったなど
    感じた思いを「ありがとう」で
    伝えてください

関連するQ&A

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

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

あなたの悩みをみんなに解決してもらいましょう

  • 質問する
  • 知りたいこと、悩んでいることを
    投稿してみましょう
-PR-
-PR-
-PR-

特集


第1回『原発再稼働』について質問募集中!

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ