如何使用fgets逐行读取文件

时间:2017-01-27 20:26:28

标签: c file fgets c-strings

我是编程的新手,所以有一些我不知道的基础知识和常识。我有一个关于如何正确使用fgets的问题。根据对fgets的解释,似乎fgets应该在读取n-1个字符,点击EOF或点击换行符时停止。 例如,我创建了一个如下文本文件:

red  100
yellow  400
blue  300
green 500
purple 1000
...

颜色和整数由制表符分隔。当我创建这个文本文件时,我需要在每行的末尾按Enter键以开始一个新行。在这种情况下,按Enter键等于添加换行符,'\ n',是吗?

如果每行末尾有一个'\ n'是正确的,我运行fgets代码如下:

fgets(string, 100, fp);

由于每行中包含的字符远小于100,因此fgets应该在达到maxlength限制之前触及换行符,并且应该停止并返回NULL。这是对的吗?

如果我上面的理解不正确,每行末尾没有'\ n',或者fgets没有在每一行的末尾停止,maxlength的数量是多少(即,n中的N) fgets(string,N,stream)函数)我应该选择以确保由于我的最终目标正确输入文件是解析每一行并将每一行存储到一个结构中。顺便说一下,文件中有100行。

3 个答案:

答案 0 :(得分:2)

 #include <stdio.h>

 int main()
 {
    char str[150],str2[100][150];
    int i=0,j=0,value[100];
    FILE* fp;
    fp = fopen("file.txt", "r");
    while (fgets(str,150, fp)) {
        i++;
        printf("%3d: %s\n", i, str);
        /** if you want to split value and string*/
        sscanf(str,"%s %d",&str2[j],&value[j]);
        printf("%d %s\n",value[j],str2[j]);
        j++;
    }
    fclose(fp);
    return 0;
}

答案 1 :(得分:0)

// hello.c
//
// Usage:
//
// gcc -Wall hello.c && ./a.out /tmp/somefile.txt

#include <stdlib.h>     // for perror, ...
#include <stdio.h>      // for printf, ...
#include <assert.h>     // for assert
#include <sys/time.h>   // for gettimeofday

static inline long long int nowUs () {
  long long int now;
  struct timeval timer_us;
  if (gettimeofday(&timer_us, NULL) == 0) {
    now = ((long long int) timer_us.tv_sec) * 1000000ll +
      (long long int) timer_us.tv_usec;
  }
  else now = -1ll;

  return now;
}

int main (const int argc, const char * argv[]) {
  assert(2 == argc);
  long long int started = nowUs();
  size_t count = 0;
  char msg[128], * fgets_rv;
  FILE * fp = fopen(argv[1], "r");

  while ((fgets_rv = fgets(msg, sizeof(msg), fp))) {
    assert(fgets_rv == msg);
    count++;
  }
  if (ferror(fp)) 
    perror(argv[1]);
  else if (feof(fp)) {
    printf("Read %zu lines of file '%s' in %lldµs\n", 
        count, argv[1], nowUs() - started);
  }
  else {
    printf("UNEXPECTED\n");
  }
  fclose(fp);
  return 0;
}

示例输出:

alec@mba ~/process/sandbox $ gcc -Wall hello.c && ./a.out /tmp/bigfile.t02
Read 100000 lines of file '/tmp/bigfile.t02' in 16521µs

答案 2 :(得分:-1)

fp = fopen("sample.txt", "r");
while (1) {
        if (fgets(line,150, fp) == NULL) break;
        i++;
        printf("%3d: %s", i, line);
}
printf("%d\n",i);