正确使用文件指针
Using file pointers correctly
我有一个关于文件指针的基本问题。在下面的代码中,我有一个 while 循环,然后是一个 for 循环。 for 循环只会显示行数,除非我再次 fopen 文件 - 这正常吗?如果是这样,我应该在 while 循环之后预先 fclose 它吗?可能有一些我不知道的 "rewind" 函数,所以我的整个方法可能是错误的。我意识到 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] = '[=10=]';
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
正常,需要rewind()
文件。问题是当 for
循环开始时文件已经到达末尾,因此读取将失败并且 feof()
将 return 非零。
两个选项
rewind(fp);
或
fseek(fp, 0L, SEEK_SET);
当您再次调用 fopen()
时,您会泄漏资源,因为您覆盖了指针,现在您无法 fclose()
第一个 fopen()
ed 文件。
您可以按照@iharob 的建议使用rewind()
,或者您可以关闭并重新打开文件:
while (l < MAXLINES && fgets(lines[l], sizeof(lines[0]), fp)) {
lines[l][strlen(lines[l])-1] = '[=10=]';
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++;
}
}
我有一个关于文件指针的基本问题。在下面的代码中,我有一个 while 循环,然后是一个 for 循环。 for 循环只会显示行数,除非我再次 fopen 文件 - 这正常吗?如果是这样,我应该在 while 循环之后预先 fclose 它吗?可能有一些我不知道的 "rewind" 函数,所以我的整个方法可能是错误的。我意识到 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] = '[=10=]';
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
正常,需要rewind()
文件。问题是当 for
循环开始时文件已经到达末尾,因此读取将失败并且 feof()
将 return 非零。
两个选项
rewind(fp);
或
fseek(fp, 0L, SEEK_SET);
当您再次调用 fopen()
时,您会泄漏资源,因为您覆盖了指针,现在您无法 fclose()
第一个 fopen()
ed 文件。
您可以按照@iharob 的建议使用rewind()
,或者您可以关闭并重新打开文件:
while (l < MAXLINES && fgets(lines[l], sizeof(lines[0]), fp)) {
lines[l][strlen(lines[l])-1] = '[=10=]';
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++;
}
}