view getStrFromFile.cc @ 143:be127b7d1812

minor fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 23 Jul 2011 10:18:28 +0900
parents 6674b7498075
children
line wrap: on
line source

/* getStrFromFile.cc */

#include "getStrFromFile.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
  getStrFromFile関数
  指定したテキストファイル内から,
  ある文字列(searchStartStr)とある文字列(searchEndStr)の間の文字列を抜き出す.
  抜き出した文字列の数を返す.
  char **date に抜き出した文字列を二次元配列のポインタを渡す.
  中でmallocしてるから、使い終わったら free(date)しないとダメかも
  reallocとかでfree()しなくて良い方法も教えて下さい.
*/

int getStrFromFile( char **getStrData, const char *fname, const char *searchStartStr, const char *searchEndStr )
{
  // 読み込んだ文字列の回数. 最後にコレを返す
  int num = 0;

  FILE *fp;

  const int BUFSIZE = 256;
  char buf[BUFSIZE]; // 一行読み込み

  fp = fopen( fname, "r" );
  if ( fp ==NULL ){
    printf("fileNameError\n");
    return 0;
  }

  // ファイルの終端まで一行読み込みをループする
  while( feof(fp) == 0 ){

    fgets( buf, BUFSIZE, fp );

    char *p1 = strstr( buf, searchStartStr ); // 文字列検索。
                                              // 見つけた位置のポインタを返す
                                              // 見つけれなかったらNULLを返す

    if( p1 != NULL ){
      //int p1Len = strlen(p1);
      char *p2 = strstr( p1, searchEndStr );
      //int p2Len = strlen(p2); //

      // 余分なsearchEndStr以降の文字列を切り捨てるため空白文字(改行文字だっけ?'\0'ってなんだっけ)
      //p1[p1Len - p2Len] = '\0'; 
      *p2 = '\0';
      int searchStartStrLen = strlen(searchStartStr);
      
      // +searchStartStrLenで最初の余分な文字列をカウントしないようにする
      int lenNum = strlen(p1 + searchStartStrLen);

      // 動的にメモリ確保したい。なんかオカしいってのはわかるケド、良い方法が思いつかん
      getStrData[num] =  (char*)malloc(sizeof(char)*lenNum+1);
      
      strcpy(getStrData[num], p1+searchStartStrLen); 

      num ++;
      if (num>=64) {
	printf("Too many objects in file %s\n", fname);
	exit(0);
      }
    }
  }

  fclose( fp );

  printf("num = %d\n",num);

  for( int i = 0; i < num; i ++ ){
    printf("getStrData[%d] = %s\n", i, getStrData[i]);
  }

  return num;
}