C言語関係掲示板

過去ログ

No876 ファイルを再度読む

[戻る] [ホームページ]
No.11370

ファイルの最下行
投稿者---ファイル(2003/12/21 07:36:56)


ファイルの行数で処理を分けたいと思います。
ファイルが100行以上なら処理をして、100行未満なら何もしないです

#define N 100

int main(void)
{
FILE *ifp, *ofp;
char fd[256],buff[256];
char *p_fd[256];
int n;

While (fgets(buff, 256, ifp) == NULL){
n++;
}

if (n>N-1){
fgets(fd,256,ifp);
p_fd[0]=strtok(fd,",");
printf("%s\n",p_fd[0]);
}
else;

While (fgets(buff, 256, ifp) == NULL)
で1行読み込みを行い、nで行数を調べ、 nが100行以上なら処理を
するのですが、1度fgets(buff, 256, ifp)でファイルを読み込んだ後、
fgets(fd,256,ifp);では最初からファイルを読まないようで
処理が出来ません。どう書けばよいのでしょう

No.11371

Re:ファイルの最下行
投稿者---たか(2003/12/21 09:49:57)


>ファイルの行数で処理を分けたいと思います。
>ファイルが100行以上なら処理をして、100行未満なら何もしないです

>While (fgets(buff, 256, ifp) == NULL)
>で1行読み込みを行い、nで行数を調べ、 nが100行以上なら処理を
>するのですが、1度fgets(buff, 256, ifp)でファイルを読み込んだ後、
>fgets(fd,256,ifp);では最初からファイルを読まないようで
>処理が出来ません。どう書けばよいのでしょう

fgets()がファイルの終わりを検出するのはNULLを返してきた場合ですか
ら、==ではなく!=で比較する必要があります。

次にfgets()を実行する時は必ずファイルの終端までファイルポインタが
移動していますから、読み込んでも何も得られません。ですから、fgets()
をする前にrewind()もしくはfseek(ifp, 0, SEEK_SET)でファイルポインタ
をファイル先頭に移動してから再度読み込む必要があります。

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

#define N 100

int main(void)
{
  FILE *ifp, *ofp;
  char fd[256], buff[256];
  char *p_fd[256];
  int n = 0;

  ifp = fopen("affine.cpp", "r"); /* 例えば */
  
  while (fgets(buff, 256, ifp) != NULL) 
    n++;

  if (n > N - 1) {
    rewind(ifp);
    fgets(fd, 256, ifp);
    p_fd[0] = strtok(fd, ",");
    printf("%s\n", p_fd[0]);
  }
  else;

  fclose(ifp);

  return 0;
}



No.11372

Re:ファイルの最下行
投稿者---たか(2003/12/21 09:54:07)


ついでですが

if (ifp == NULL) {
 fputs("ファイルが開けません。", stderr);
 exit(1);
}

をfopen()の後ろにつけてfopen()が不成功の場合プログラムを終了した
方がよりいいです。

No.11373

Re:ファイルの最下行
投稿者---ファイル(2003/12/21 13:31:44)


>次にfgets()を実行する時は必ずファイルの終端までファイルポインタが
>移動していますから、読み込んでも何も得られません。ですから、fgets()
>をする前にrewind()もしくはfseek(ifp, 0, SEEK_SET)でファイルポインタ
>をファイル先頭に移動してから再度読み込む必要があります。

ありがとうございます。勉強になります。
またよろしくお願いします。