• ベストアンサー

ファイルから読み取った「行の長さ」は・・?

すみません。 while (fgets(buff, 256, pFile) != NULL) { ~~~ } として1行ずつファイルを読み込み、その中で1文字ずつ処理する為に 必要なforループのループ回数を得たいのですが・・ char buff[256]; // 先に確保した配列を、fgetsした後に int buff_length = sizeof(buff) /sizeof(buff[0]); // 長さを得ようとする こうすると確保したサイズ256が返ってきてしまい困っています。(当然かもですが・・ ファイルの1行の長さを毎回取得する方法は無いでしょうか?

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

  • ベストアンサー
回答No.1

文字列町ならstrlenでは?

zaxs5968
質問者

お礼

ありがとうございます。 ブランクが有ったせいか、存在をすっぽり忘れてました・・ orz

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

char *p = strchr(buf, '\n'); if (p != NULL)  buff_length = p - buf; else  /* 行の途中で切れた */ といった感じでどうでしょうか? なお、上記では、行末の改行文字を長さに含んでいません。

zaxs5968
質問者

お礼

ありがとうございます。 処理の参考にさせて頂きます。

  • nagare
  • ベストアンサー率33% (280/831)
回答No.2

使う関数は sizeof() じゃなくて strlen() ですよ また、改行コードも含まれますので、-1が必要と思います

zaxs5968
質問者

お礼

改行コードの存在・・すっかり忘れていました、 ありがとうございます。 orz

関連するQ&A

  • ファイルの読み込みとメモリ確保について。

    ファイルから文字を読み込んで それを配列に入れて辞書順にソートさせようとしています。 それで、ソート以前の問題なのですが、ファイルから文字列を読み込んで配列にいれようとするのですが、 buffを動的にメモリ確保してその配列に入れたいと考えているのですが、なぜか入ってくれません。 whileでファイルの終わりがくるまで一行ずつ読み込んで それをsに入れていき、sをbuff[]の配列に順番にいれていこうとしているのですが・・・。 ファイルは aaaa aabc dda wer zie ced sdfe be など適当な文字の並びです。 malloc関数で動的に確保したメモリはその後普通の配列と同様に使えるのではなかったのでしょうか? なので普通にbuff[i]=s;といった処理で入れれると思ったのですが。 ファイルは一行の長さの最大が100で 行数が4000行あると仮定しています。 今は小さいファイルでテストしていますが。 以下ソースです。 #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 #define MAX_LINE 4000 main() { FILE *fp; char *buff,s[MAX_SIZE]; int i; fp=fopen("words.txt","r"); buff=(char*)malloc(sizeof(char)*MAX_LINE); i=0; while(fgets(s,MAX_SIZE-1,fp)!=NULL){ buff[i]=s; printf("%s",buff[i]); i++; } fclose(fp); } とりあえずファイルの内容を配列に入れないとソートできないので、配列に全て入れてしまいたいと考えています。 間違いがどこにあるのか指摘よろしくおねがいします。m(-_-)m

  • C言語の領域確保について

    C言語を始めたばかりのものです。 配列を計算させようと下のようなプログラムを作り、一応動作はするのですが、配列の領域確保がいまいちわかりません。配列はcsvから値をとっています。確保する領域は、代入する値の数でいいので、buff[8×64]、とかarv[4×32]でいいと思い、それより少し大きな値くらいで実行すると失敗してしまいます。  自分の理解の仕方が間違っているとは思っているのですが、(char *)malloc(M*N*sizeof(char))でやっても失敗しました。どうすればよいかお教え願います。ちなみに、csvの値は0.000852354710804709のように桁が半端ないです。  またfgetsのライン数の値も正しくするにはどうすればよいのでしょうか。できたらmallocを使えたらよいと思っています。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 8 //8行 #define M 64 //64列 int main() { char *fname = "test.csv";//8行64列 char *ffname = "tk.csv";//4行32列 FILE *IN1, *IN2, *OUT1, *OUT2; char buff[100000];//←問題の部分 char *pbuff; char arv[400];//←問題の部分 char *parv; double a[N][M+30], b[N][M], c[N][M], w[4][32]; int i, j, x; double m, n; int count=0; if((IN1 = fopen(fname, "r")) == NULL){ printf("can't open the %s", fname); return 0; } if((IN2 = fopen(ffname, "r")) == NULL){ printf("can't open the %s", ffname); return 0; } i=j=0;//配列の取得 while(fgets(buff, 100000, IN1) != NULL){ pbuff = buff; while((pbuff = strtok(pbuff, ",\n")) != NULL){ a[i][j++] = strtod(pbuff, NULL); pbuff = NULL; } i++; j=0; } i=j=0;//配列の取得 while(fgets(arv, 400, IN2) != NULL){ parv = arv; while((parv = strtok(parv, ",\n")) != NULL){ w[i][j++] = strtod(parv, NULL); parv = NULL; } i++; j=0; }             :             :             : このプログラムでも計算はできるのでいいのですが、最終的には500行2048列の計算をしないといけないので、いっそう数字が膨大となるために質問させていただきました。Visual Stdio 2010 c/c++ 使ってます。

  • 漢字を配列に入れたいのですが

    漢字を配列に入れたいのですが、うまくいきません。 3列、60行のcsvファイルを読み込んで配列に入れようをしているのですが、1列目、2列目、3列目にある漢字をそれぞれ配列に入れようとしているのですが、出力するとうまくいかないんです。誰か教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; unsigned int data1[60], data2[60], data3[60]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; ll= fgets(buff,MAXBUFFSIZE,fp); while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; j++; } printf("%s\n%s\n%s\n", data1,data2,data3); }

  • C言語 ファイル内のデータと入力したデータの重複

    テキストファイルを読み込み、入力したデータとの重複がないかどうかを調べたいのですが、 わからない点があるため、質問させていただきます。 -------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {    FILE *fp;    char datafile[];= "sample.txt";    char buff[512]; //読み込んだ1行分のデータを格納    char *data[1000]; //読み込んだデータを格納    int data_c = 0; //データの数    char str[256]; //入力された文字列を格納    int i;    int check; //重複チェック         (中略)    //ファイルを1行ずつ読み込み、その長さのメモリを確保し、値をコピー    while(fgets(buff, sizeof buff, fp) != NULL) {      data[data_c] = (char*)malloc(strlen(buff) + 1);      strcpy(data[data_c++], buff);    }         (中略)    //文字列を入力    fgets(str, 256, stdin);    check = 0;    //すでにあるデータと入力したデータの重複を調べる    for(i=0; i<data_c; i++) {      if(strcmp(data[i], str) == 0) {      check = 1;      break;      }    }         (中略) -------------------------------------------------------- 例えば読み込むファイルに5行書かれていた場合、 data[0]からdata[4]に確保したメモリの先頭アドレスが格納されますよね? ということはdata_cの値は4となるのですが、 その後のファイルデータと入力したデータの重複を調べるところで、 for(i=0; i<data_c; i++) となっており、data[0]からdata[3]までの4行分しか調べられないことになります。 なぜ、i<=data_cではなく、i<data_cとなっているのか、わかりましたら教えていただけますでしょうか。

  • 文章中から特定の文字列を抜き出すプログラムについて C言語

    log.txtの文章からIPを抜き出しip.txtに書き込むというものです。log.txtの文章は基本的にfrom IP:port の順です。しかし文章中にfromがないとip.txtで空欄になってしまいます。 例192.168.1.100  192.168.1.110 理想はfromがない行はなにも追加せず次に移りたいのですがどうすればいいでしょうか? 例192.168.1.120 192.168.1.130 192.168.1.140 void addLine(const char*,FILE*); char *getFromIP(const char*,char*); int main() { FILE *pFileA = fopen("log.txt","rt"); char buff[256]; if(pFileA){ FILE *pFileB = fopen("ip.txt","wt"); if(pFileB){ for(;fgets(buff,256,pFileA) != NULL;){ char buff2[32] = {'\0'}; addLine(getFromIP(buff,buff2),pFileB); } fclose(pFileB); } fclose(pFileA); } return 0; } char *getFromIP(const char *line, char *buff) {  char *src, *dst;        src = strstr(line, "from");  if(src==NULL) { return buff; }   src += 4;            dst = buff;          while(1) {   if(isspace(*src))  {    src++;    continue;          }   else break;         }                    while(1) {   *dst = *src;          if(*dst == ':')        {    *dst = '\0';          break;           }   if(*dst == '\0')       {   break;           }  dst++;            src++;           }  return buff;         } void addLine(const char *str,FILE *pFile){ char buff[1024]; sprintf(buff,"%s\n",str); fputs(buff,pFile); }

  • 行の操作

    ファイルから行を読み込み、それに順じて行をソートするプログラムを作りたいのですが、ちょっと混乱しています。ファイルは、以下のようになっています。 abcedf 0.53343 efghij 0.09473 klmnop 0.23453 . . . これをスコアとして行ごとに並べ替えようと思っています。以下のようなプログラムを考えたのですが、まず配列の格納がうまくいきません。よろしくお願いします。 main(){ int i, j; char line[50], name[50]; double *sor,tmp; FILE *qqq; sor=(double*)malloc(sizeof(int*)*Y); qqq = fopen("score_sort.txt","r"); //行単位の操作 while (fgets(line ,15, qqq) != NULL) { sscanf(line,"%s %f",name ,sor); } for(i=0;i<Y;i++) printf("sor[%d]=%f\n",i,sor[i]); return 0; fclose(qqq); }

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

    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); }

  • reallocについて

    現在、領域を拡張しながら、 ファイルを読み込んで呼び元に返却するPGを作成しています。 reallocがうまくいかないので、試しに小さいのを作って みましたが、これだとreallocの2度目で落ちます。 100文字ずつ呼んでいるので、拡張も100文字ずつ行っています。 メモリ確保に失敗なら、まだ分かるのですが、 ちょっと理由がわかりません。 reallocを複数繰り返していることも問題だと思いますが、 まずは正常に処理を流したいと考えています。 よろしくお願いします。 ~~~~~~ソース~~~~~~~~ //ファイルを読み込んでから領域を確保する #include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFF 100 int main() { FILE *fp; char tmp[BUFF+1]; char *str; int len = 0; fp = fopen( "c:/test.txt" , "rb" ); if(fp ==0){ printf("ファイルがありません\n"); return -1; } //領域を初期化 str = (char *)malloc(1); memset(str,'\0',sizeof(str)); while(feof(fp)==0){ memset(tmp,'\0',sizeof(tmp)); fgets(tmp,BUFF,fp); //領域を再確保 len += BUFF+1; if(NULL == ((char *)realloc(str,len))){ printf("メモリ確保エラー"); } //読み込んだ値を変数に追加 strcat(str,tmp); } printf("文字列\n\n%s\n",str); printf("長さ:%d\n",len); fclose(fp); return 0; }

  • バイナリ読み込み時のデータ受け渡しについて

    質問させていただきます。 XMLファイルを圧縮後にバイナリ読み込みし、long*に設定してそれを4バイトのlong配列に格納したいと考えています。 ファイルを読み込む際にはデータ数が解らないので、ループを回したいと思っています。 以下に一部記載します。 これでpBinaryには正常にバイナリデータが入るのでしょうか? わかる方がいれば教えてください。 ****************************************** FILE *pFile = NULL; pFile = fopen("XMLFile.xml", "rb"); int iRet = 0; int iSize = 0; bool bRet = false; long *pBinary = new long; while(bRet != true) { /* 4バイトずつ読み込みpBinaryに設定する */ fread(pBinary, sizeof(4), 1, pFile); if(iRet != 1) { bRet = true; } else { iSize++; } }

  • Cでファイルの行数をカウントするには

    ファイルの中の行数をカウントするにはどうすればよいか プログラムの行数ならその行数分だけ またコメントや空白行もカウントするにはどうしたらよいか 以下のプログラムに追加したい場合どうしたらよいか教えてください。 #include <stdio.h> int main(int argc , char *argv[]){ char s[256]; int i; FILE *fin; int local; int nCount = 0; for(i = 1 ; i < argc ; i++){ printf("%s\n",argv[i]); local = 0; fin=fopen(argv[i],"r"); memset(s,0,sizeof s); while(fgets(s,sizeof s,fin) != NULL){ // printf("%s",s); local++; nCount++; } memset(s,0,sizeof s); while(fgets) printf("local count = %d\n",local); fclose(fin); } printf("grobal count = %d\n",nCount); return 0; }

専門家に質問してみよう