2016-02-10 44 views
2

我有一個關於文件指針的基本問題。在下面的代碼中,我有一個while循環,然後是for循環。 for循環只會顯示行數,除非我再次打開fopen - 是否正常?如果是這樣,我應該預先在while循環之後嗎?可能有一些我沒有意識到的「倒帶」功能,所以我的整個方法可能是錯誤的。我意識到while循環和for可以合併,但是這個我的問題是關於fopen,fclose並且再次使用來自fopen的數據。正確使用文件指針

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

#define MAXLEN 200 

enum { MAXLINES = 200 }; 
char lpath[MAXLINES][BUFSIZ]; 

int main(int argc, char **argv) { 

     char c; 
     int l = 0, n = 0, i = 0, count = 0; 
     char lines[MAXLINES][BUFSIZ]; 

     FILE *fp = fopen(argv[1], "r"); 

     if (fp == 0) { 
       fprintf(stderr, "failed to open input.txt\n"); 
       exit(1); 
     } 

     while (l < MAXLINES && fgets(lines[l], sizeof(lines[0]), fp)) { 
       lines[l][strlen(lines[l])-1] = '\0'; 
       puts(lines[l]); 
       l++; 
     } 

     // fp = fopen(argv[1], "r"); // below won't output unless fopen again 
     for (c = getc(fp); c != EOF; c = getc(fp)) { 
      if (c == '\n') { 
       count++; 

     } 
     printf(">> line count: %i", count); 

     fclose(fp); 
} 

又看了看:Pointer best practice

+0

1)更好地利用'fgetc'。 2)'都返回一個'int',而不是'char。 3)因此,你的'EOF'測試是錯誤的,並且如果'char'是未簽名的將會總是失敗! – Olaf

+0

@Olaf:我從這裏得到了這段代碼:http://stackoverflow.com/a/4237107/5905926,所以也許讓他們知道......謝謝 –

+0

「可能有一些」倒帶「功能,我不知道「 - 有!事實上,它被稱爲「倒帶」。 – immibis

回答

5

這是正常的,你需要rewind()文件。問題是,當for循環啓動時文件已達到結尾,因此讀取將失敗,feof()將返回非零值。

兩個選項

rewind(fp); 

或者

fseek(fp, 0L, SEEK_SET); 

當你調用fopen()再次因爲您覆蓋指針您泄漏資源,現在你不能fclose()第一fopen()編輯文件。

+0

謝謝 - 我想這是它) –

0

你可以使用rewind()作爲@iharob建議,或者您也可以關閉並重新打開文件:

while (l < MAXLINES && fgets(lines[l], sizeof(lines[0]), fp)) { 
      lines[l][strlen(lines[l])-1] = '\0'; 
      puts(lines[l]); 
      l++; 
} 

fclose(fp); 
fp = fopen(argv[1], "r"); // below won't output unless fopen again 
for (c = getc(fp); c != EOF; c = getc(fp)) { 
    if (c == '\n') { 
     count++; 
    } 
}