タブ区切りのファイルから一列目を読み取るプログラム

このQ&Aのポイント
  • 下のプログラムは、タブ区切りのファイルから一列目を読み取るプログラムです。
  • プログラムの中で、tabを「' '」として扱っている箇所がありますが、これは正しいのでしょうか?
  • 質問者は、「' '」がtabを表しているのか疑問に思っています。
回答を見る
  • ベストアンサー

tab

下のプログラムソースは、jinji.txtの各行の一列目を読み取るプログラムです。 jinji.txtには項目がtabで区切られています。 たとえば、下のようになっています。 番号 tab 姓 tab 名 1 tab 高田 tab 太郎 2 tab 山田 tab 順平 … 300 tab 永井 tab 晃 ソースの真ん中ぐらいに、 while(buff[count]!=' ') とあります。これは最初のtabまで読み取る、つまり一列目を読み取るコードなのですが、tabは「' '」でいいのでしょうか?「' '」でtabだと判断できますか? #include<stdio.h> #define num 100 int main(){ FILE *fp; char buff[num],bango[10]; int count; fp = fopen("jinji.txt","r"); if(fp == NULL) exit(1); fgets(buff,sizeof(buff),fp); count=0; while(buff[count]!=' '){ bango[count]=buff[count]; count++; } //printf("%s\n",bango); fclose(fp); }

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>各行の一列目を読み取るプログラムです。 ★先頭行のみの読み取りとなっています。   while( NULL != fgets( buff, 100, fp ) ){ として   行(レコード)が終わるまで読み込む。 ★ご質問主旨のタブ(デリミタ)の処理は、   #define DLMTR (0x09) // \t   while( DLMTR != buff[count] ){ ★文字列の終端処理をする。   bango[count] = 0x00; // 出力直前   //printf("%s\n",bango);

参考URL:
http://e-words.jp/p/r-ascii.html
gooaist
質問者

お礼

回答だけではなく、プログラムのミスの指摘をありがとうございました。 >★文字列の終端処理をする。 →教えてくださってありがとうございます。NULLを入れてなかったので、プログラム実行結果に変な文字が出力され、tabの表現が間違っているのかなと思っていましたが、そうではなく、文字列の終端処理が必要だったんですね。ありがとうございました。

その他の回答 (3)

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.3

他の方が書かれているように、 TAB は '\t' と書いたほうがわかりやすいでしょう トリッキー というか 他の人(時間が経てば自分も)を悩ませたいなら ' [TAB]を押す ' でもいいかと思います 環境にもよりますが、' 'っぽく見えることがあります TABくらいなら、こんな書き方をしても大抵の処理系で大丈夫でしょう、多分

  • kusa_cw
  • ベストアンサー率50% (4/8)
回答No.2

タブは'\t'となります。 エスケープシーケンスで調べるか、char型の変数に' 'と'\t'を入れて数値として表示させて確認すると良いかと思います。

回答No.1

> tabは「' '」でいいのでしょうか?「' '」でtabだと判断できますか? いちいち訊くより動かしてみりゃわかるんじゃない? # tabは '\t' です。

関連するQ&A

  • プログラムソースの誤りを教えてください

    CSVファイル(カンマでデータの要素が区切られている)の左から数えて15個目と16個目の間のデータを読みとるプログラムをつくりたいのですが、できません。どこがおかしいのか教えてください。 #include<stdio.h> int main(){ FILE *fp; char buff[562],yakusyoku[10]; int youso,n,konma; fp = fopen("jinji.csv","r"); if(fp == NULL) exit(1); fgets(buff,sizeof(buff),fp); n = 0,youso = 0,konma = 0; while (youso < sizeof(buff)){ if(buff[youso] == ','){ konma++; if (konma == 15){//カンマが15個になったら次の処理を行う while(buff[youso] != ','){//次のカンマ(16個目のカンマに会うまで次の処理を行う) yakusyoku[n] = buff[youso]; youso++,n++; break; } } } youso++; } fclose(fp); }

  • C++初心者です。ご指導よろしくお願いします。

    C++初心者です。ご指導よろしくお願いします。 C++で特定の行の値を読み込むプログラムを作っています。 a.txtとb.txtが入力ファイルで、c.txtが出力ファイルです。 a.txtには 237891 193203 1355876 ・ ・ ・ (以下1~5000000の数値がランダムに15000行分) b.txtには 0.333333 0.333333 0.397396 ・ ・ ・ (以下0.333333~0.822222までの数値がランダムに5000000行分) が書いてあって、 c.txtに a.txtの1行目の数値の行に対応するb.txtの値 a.txtの2~ a.txtの3~ ・ ・ ・ (以下15000行分) を出力するプログラムを作りたいと思っています。 以下のように、プログラムを書きましたが、a.txtが10行、b.txtが20行程度の時は問題なく動くのですが、行数が多くなると急に動かなくなります。 charのところを変えたり、offsetのところを変えたりしたのですが、最初の1行を読み込んだところで止まってしまいます。 (buffの値は=237891 no2の値は=237891まで) どのようにすれば動くようになるでしょうか? ご指導よろしくお願いします。 #include <stdio.h> #include <iostream> #include <fstream> #include <cstdlib> #include <cstring> using namespace std; int main(void) { FILE *fp,*fp2,*fp3; char buff[256],buff2[256]; long int offset[100],offset2[100]; long int max,max2; long int no=0; long int no2=0; for(no=1; no<=15000; no++){ fp = fopen("input/a.txt","r"); if(fp == NULL){ cout << "入力ファイルをオープンできません\n"; } for ( max = 0 ; !feof(fp) ; max++ ){ if ( max >= 100 ){ break; } offset[ max ] = ftell( fp ); fgets( buff, sizeof(buff), fp ); } fseek( fp, offset[no - 1], SEEK_SET ); fgets( buff, sizeof(buff), fp ); cout << "buffの値は=" << buff << "\n"; no2 = atoi(buff); cout << "no2の値は=" << no2 << "\n"; fp2 = fopen("input/b.txt","r"); if(fp2 == NULL){ cout << "入力ファイルをオープンできません\n"; } for ( max2 = 0 ; !feof(fp2) ; max2++ ){ if ( max2 >= 100 ){ break; } offset2[ max2 ] = ftell( fp2 ); fgets( buff2, sizeof(buff2), fp2 ); } fseek( fp2, offset2[no2 - 1], SEEK_SET ); fgets( buff2, sizeof(buff2), fp2 ); cout << "buff2の値は=" << buff2 << "\n"; fp3 = fopen("input/c.txt","a"); if(fp2 == NULL){ cout << "入力ファイルをオープンできません\n"; } fprintf(fp3, buff2); strcpy(buff,"0"); strcpy(buff2,"0"); no2=0; cout << "buff2は初期化されて=" << buff2 << "\n"; fclose(fp); fclose(fp2); fclose(fp3); } }

  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず0~255の1000個の乱数ファイルdata.txtを読み込み、 ヒストグラムは出来たのですが、 エクセルでグラフを作りたいので、 data1.txtに書き込みたいので、下のソースでやってみましたが、 0~255のカウントが全部0になってしまします。 fp = fopen("data1.txt","w");が無ければ正常に処理されます。 どうか教えてください。よろしくお願いします。 #include <stdio.h> #define BUF 10 #define MAX 256 void count(FILE *fp , int* counter); int main(void) { FILE *fp; fp = fopen("data.txt","r"); fp = fopen("data1.txt","w"); int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } count(fp , counter); for(i=0 ; i<MAX ; i++) { printf("%d %d\n" , i, counter[i]); } fclose(fp); return 0; } void count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } }

  • クイックソート

    実行時にエラーが出てしまいます。問題点がわかる方お願いします。(インクルード略、800字に収まらなかったので問題があると思われる部分だけ書きます。)ちなみにエラーは外部参照~という感じです。 typedef struct in_data { char bango[No_SIZE]; int ki; }RD; RD *q_sort(RD a[],int n0,int nn); void swap(RD *pa,RD *pb); void main() { FILE *fpa; FILE *fpb; char in_buff[BUFF_SIZE]; RD buff[ARRY_SIZE]; int i; fpa = fopen("data.TXT","r"); for(i=0;i < ARRY_SIZE;i++){ fgets(in_buff,BUFF_SIZE,fpa); strncpy(buff[i].bango,in_buff,No_SIZE); buff[i].bango[No_SIZE] = '\n'; buff[i].ki = atoi(&in_buff[No_SIZE]); } fclose(fpa); q_sort(buff,0,ARRY_SIZE-1); fpb = fopen("result.TXT","w"); for(i=0;i < ARRY_SIZE ; i++) fprintf(fpb,"%*s %*d\n",No_SIZE,buff[i].bango, season_SIZE,buff[i].ki); fclose(fpb); } RD *qsort(RD a[],int n0,int nn) { char x; int i,j; if(nn - n0 == 1){ if(strcmp(a[n0].bango,a[nn].bango)>0) swap(&a[n0],&a[nn]); } else if (nn - n0 >1){ x = (n0+nn)/2;

  • プログラムの異常終了

    TEST2とコマンドプロンプトに表示された後、異常終了します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char **f_name2){ printf("ファイル名を入力"); scanf("%s",*f_name2); } int count_num(FILE *fp){ int ch =0; int count=0; while((ch=fgetc(fp))!=EOF){ if(ch>0&&ch<9){ count++; } } return(count); } int main (void){ char *fname; FILE *fp; get_name(&fname); if((fp=fopen(fname,"r"))==NULL){ printf("ファイルオープンエラー"); }else{ printf("%d\n",count_num(fp)); } fclose(fp); printf("TEST2\n"); return(0); } textc13-7.exeは動作を停止しました。と表示があります。正常に終了したいので、 御指摘お願いします。

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力するのはどうやってやるのですか?教えてください。以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。これに処理時間を出力するようにしてもらいたいのですが、どうしたらいいですか?解説とソースファイルをよろしくお願いします。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; }

  • C言語についてアドバイスをください。

    CSVファイルの内容をfreadで読み込み、strtokを使わずにbuffに格納した後、 buffから1文字ずつbuff2へコピーさせていって、コンマがきたら数字、 改行がきたら名前と判別して、自作関数に渡して表示させたいです。 CSVファイルの内容は 『11,名前1(改行) 15,名前2(改行) 18,名前3』 といった感じです。 ------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUM 256 struct kou { short nenrei; char namae[30]; }; void pri(struct kou *o) { printf("%d\n%s\n",o->nenrei,o->namae); } int main(void) { FILE *fp; // ファイルポインタ char buff1[NUM] = {0}; char buff2[NUM] = {0}; char *fname = "text1.csv"; // ファイル名を指定 short i = 0; int n = 0; struct kou p; fp = fopen(fname, "r"); if(fp == NULL) { printf("%sファイルをオープンできませんでした。\n",fname); } fread(buff, 1, NUM, fp); while(buff1[n] != NULL) { buff2[n] = buff1[n]; // buff2[0]からbuff1の中を一文字ずつコピーしていく。 if(buff2[n] == ',') // buff2に格納されていく中にコンマがきたら以下の作業を行う。 { i = (short)atoi(buff2); // char型からshort型への変換 p.nenrei = i; } if(buff2[n] == '\n') { strcpy(p.namae,buff2); // p.namaeにbuff2をコピー。 pri(&p); } n++; } fclose(fp); printf("ファイルをクローズしました。\n"); return 0; } ------------------------------------------------------- 今のままだと 『11 11,名前1 11 11,名前1 15,名前2』 という表示になってしまいます。 while 内で既に読み込んだ部分を読み込ませないよう(表示させないよう)にできたら良いと思うんですが、そういったやり方はあるのでしょうか? むしろやり方を変えたほうが良いでしょうか・・・。 まだC言語を学び始めて日が浅いので、色々間違っている部分もあると思いますが、 そういったことを含めてアドバイスをいただけたらと思います。 よろしくお願いします。

  • 構造体の動的メモリについて

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM 10 /*生徒数*/ typedef struct data { int num; /*従業員番号*/ char name[16]; /*名前*/ int jap; /*国語の点数*/ int math; /*数学の点数*/ }data; int main(void) { data test[NUM]; /*生徒のデータ*/ FILE *fp; /*ファイル操作用*/ int i; /*配列インデックス*/ int count; /*データ分割用*/ char s[100]; /*データ読み込み用*/ char *token; /*データ分割用*/ char *data[6]; /*分割データ保存用*/ fp = fopen ("data1.txt","r");        for (i=0; i<NUM; i++){ fgets (s, sizeof(s), fp); /*dataファイルから1行読み込み*/ token = strtok(s, ","); /*読み込んだデータを","で分割する*/ count=0; while (token != NULL){ data[count] = token; /*分割したデータを配列へ入れる*/ token = strtok(NULL,","); count++; } test[i].num = atoi(data[0]);       strcpy (test[i].name, data[1]); test[i].jap = atoi(data[2]); test[i].math = atoi(data[3]); } fclose(fp);       } このプログラムを構造体へのポインタの配列で管理するように変えたいのですが、どのように変更すればいいのでしょうか。 条件として、個人データを格納するメモリ領域とポインタの配列のメモリ領域は動的に確保します。 初心者でよくわからないので詳しく教えていただけると助かります。よろしくお願いします。

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力させることはできたんですが、単位がわかりません。教えてください。 以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; } 実行結果: (ソートは省略) count of comparisons : 499500 count of swap : 14848 2.950000 と出力されたのですが読み方?単位が分かりません。教えてください。2分ぐらいかかった気がします。

  • Javaの問題がわからないです

    Javaでわからない問題があります。 int num=0,count; while(num<3){ num++; //ここにコードを挿入 Systrm.out.println("num="+num+":count="+count ); } } 問題のつづきが画像に続きます。 この問題なのですが、答えはcです。 なぜ生成されるコードにnum=3があるのですか? num=3をwhileの部分にいれたら、3<3になってfalseになりその時点で終了になるはずですよね?

    • ベストアンサー
    • Java