正确使用文件指针

Gun*_*nes 2 c fopen pointers fclose

我有一个关于文件指针的基本问题.在下面的代码中,我有一个while循环,后跟一个for循环.for循环只会显示行数,除非我再次打开文件 - 这是正常的吗?如果是的话,我应该FCLOSE它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);
}
Run Code Online (Sandbox Code Playgroud)

还看着:指针最佳实践

Iha*_*imi 5

这是正常的,你需要rewind()文件.问题是,当for循环启动文件已到达结束时,读取将失败并feof()返回非零.

两种选择

rewind(fp);
Run Code Online (Sandbox Code Playgroud)

要么

fseek(fp, 0L, SEEK_SET);
Run Code Online (Sandbox Code Playgroud)

fopen()再次调用时,由于覆盖指针而导致资源泄漏,现在您无法fclose()使用第一个fopen()ed文件.