【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18407

タブでデータを切り分ける方法
投稿者---とき(2004/11/26 17:21:26)


初めまして。
ファイルよりタブ区切りのデータを取得して分割・保存、後続処理を行いたいと思います。
単純に、一バイトずつ拾って比較しようとしましたところ、タブの比較が上手くできなく、頓挫してしまいました。データは、項目数不定で可変です。
strtokによるトークン分割も試みたのですが、データにNULLがあるため、利用できませんでした。

以下は、その比較が上手く出来なかったソースです。

char Buff[120+1];
char token_sv[11][20+1];/*10個以上項目があったらフォーマットエラー*/
int cnt_data = 0;
int cnt =0;
int i = 0;

while(fgets(Buff,120,fp_re))
{
    /*データ分割*/
    while(strcmp(&Buff[cnt], "\n") != 0)
    {
        if(strcmp(&Buff[cnt], "\t") == 0)
        {
            strcpy(&token_sv[i][cnt_data],"\0");
            cnt_data = 0;
            cnt++;
            i++;
        }
        else
        {
            strcpy(&token_sv[i][cnt_data],&Buff[cnt]);
            cnt++;
            cnt_data++;
        }
    }
}



他に、何か良い方法などございましたら、ご教授いただけると幸いです。
宜しくお願いいたします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:タブでデータを切り分ける方法 18408 επιστημη 2004/11/26 17:35:19
<子記事> Re:タブでデータを切り分ける方法 18409 nop 2004/11/26 17:39:49
<子記事> Re:タブでデータを切り分ける方法 18412 とき 2004/11/26 20:15:45


No.18408

Re:タブでデータを切り分ける方法
投稿者---επιστημη(2004/11/26 17:35:19)


#include <string.h>
#include <stdio.h>

char* tokenize(char** str) {
  char* endpoint;
  char* result = *str;
  if ( **str == '\0' ) return NULL;
  endpoint = strchr(*str,'\t');
  if ( endpoint ) {
    *endpoint = '\0';
    *str = ++endpoint;
  } else {
    while ( **str ) ++*str;
  }
  return result;
}

int main() {
  char data[] = "this\tstring\t\twill\tbe\ttokenized";
  char* input = data;
  char* token;
  while ( (token = tokenize(&input)) != NULL ) {
    printf("[%s]\n", token);
  }
  return 0;
}

実行結果
[this]
[string]
[]
[will]
[be]
[tokenized]

…なんも難しくないっしょ。



この投稿にコメントする

削除パスワード

No.18409

Re:タブでデータを切り分ける方法
投稿者---nop(2004/11/26 17:39:49)


>単純に、一バイトずつ拾って比較しようとしましたところ、タブの比較が上手くできなく、頓挫してしまいました。
>while(strcmp(&Buff[cnt], "\n") != 0)
>if(strcmp(&Buff[cnt], "\t") == 0)

これのどこが「1 byte ずつ」なのでしょうか?
strcmp()はその名の通り「文字列」の大小比較を行います。
「1 byteずつ」でしたら、

 if( Buff[cnt]=='\t' ) /* タブか? */

でよいのではないでしょうか?



>strtokによるトークン分割も試みたのですが、データにNULLがあるため、利用できませんでした。

まず、NULL はどこも指さない無効なポインタを意味します。
NULL を好意的に'\0'と解釈しても、
'\0'を含むデータを文字列として処理を行おうとする時点で間違いです。
fgets()などでの読み込みは止めましょう。


一番はファイル構造と設計を見直してみるのがよいかと思います。


この投稿にコメントする

削除パスワード

No.18411

Re:タブでデータを切り分ける方法
投稿者---ホワイト(2004/11/26 18:05:37)


strtokも使えますよ

#include <stdio.h>
#include <string.h>
#define BUFSIZE 120
#define FILENAME "sample.txt"

main(){
    char Buff[BUFSIZE+1];
    char *check;
    char token[11][20+1];/*10個以上項目があったらフォーマットエラー*/
    int i = 0,mem;
    FILE *fp;
    
    if(!(fp=fopen(FILENAME,"r"))){
        printf("Open Error");
        exit(0);
    }   

    while(fgets(Buff,BUFSIZE,fp)!=NULL){
        /*データ分割*/
        char *p;
        p = strtok(Buff,"\t");
        strcpy(token[i++],p);
        while((p=strtok(NULL,"\t"))!=NULL){
            strcpy(token[i++],p);
        }
        token[i-1][strlen(token[i-1])-1] = '\0';
    }
    fclose(fp);
    
    mem = i;
    for(i=0;i<mem;i++){
        printf("<%s>\n",token[i]);
    }
}



この投稿にコメントする

削除パスワード

No.18412

Re:タブでデータを切り分ける方法
投稿者---とき(2004/11/26 20:15:45)


επιστημηさん、nopさん、ホワイトさんの意見を参考にして(いずれも、そのままでは使えなかったので・・・)、どうにか形になりました。
ありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧