fgets() 如何跟踪它在哪一行?
How does fgets() keep track of what line it's on?
此代码正确地逐行读取文件,将每一行存储在 line[] 中并打印出来。
int beargit_add(const char* filename) {
FILE* findex = fopen(".beargit/.index", "r");
char line[FILENAME_SIZE];
while(fgets(line, sizeof(line), findex)) {
strtok(line, "\n");
fprintf(stdout, "%s\n", line);
}
fclose(findex);
return 0;
}
但是,我很困惑为什么在 while 循环中使用 fgets() 实际上是逐行读取文件。在学习了 Python 和 Java.
之后,我是 C 的新手
既然对 fgets() 的每次调用都是独立的,那么每次调用时,C 在哪里记住它当前在哪一行?我认为这可能与更改 FILE* index
指向的值有关,但您将指针按值传递给 fgets(),因此无法修改它。
非常感谢任何帮助理解 C 的魔力!
这不是 fgets 跟踪,findex
为您做的
findex
是一个 FILE
类型,它包括有关打开文件的信息,例如文件描述符、文件偏移量
FILE
是I/O在OS中的封装。
更多关于:FILE
Object type that identifies a stream and contains the information needed to control it, including a pointer to its buffer, its position indicator and all its state indicators.
而偏移量是为了跟踪文件,每次读取文件都是从偏移量开始的。所有这些工作都是由 FILE
完成的,它为你做,也为 fgets
关于偏移量的更多信息offset wiki
I thought it might have to do with changing the value FILE* index
points to
不是指针本身的值被改变了。该指针指向一个结构(FILE
类型),该结构包含与 structure/pointer 关联的流的相关信息。据推测,该结构的一个成员包含一个指向下一个要读取的字节的 "cursor"。
或者它可能只是有一个文件描述符 int
(就像在许多 Unice 上一样)并且 I/O 函数只是调用内核以获得有关文件描述符的信息,包括当前位置。
此代码正确地逐行读取文件,将每一行存储在 line[] 中并打印出来。
int beargit_add(const char* filename) {
FILE* findex = fopen(".beargit/.index", "r");
char line[FILENAME_SIZE];
while(fgets(line, sizeof(line), findex)) {
strtok(line, "\n");
fprintf(stdout, "%s\n", line);
}
fclose(findex);
return 0;
}
但是,我很困惑为什么在 while 循环中使用 fgets() 实际上是逐行读取文件。在学习了 Python 和 Java.
之后,我是 C 的新手既然对 fgets() 的每次调用都是独立的,那么每次调用时,C 在哪里记住它当前在哪一行?我认为这可能与更改 FILE* index
指向的值有关,但您将指针按值传递给 fgets(),因此无法修改它。
非常感谢任何帮助理解 C 的魔力!
这不是 fgets 跟踪,findex
为您做的
findex
是一个 FILE
类型,它包括有关打开文件的信息,例如文件描述符、文件偏移量
FILE
是I/O在OS中的封装。
更多关于:FILE
Object type that identifies a stream and contains the information needed to control it, including a pointer to its buffer, its position indicator and all its state indicators.
而偏移量是为了跟踪文件,每次读取文件都是从偏移量开始的。所有这些工作都是由 FILE
完成的,它为你做,也为 fgets
关于偏移量的更多信息offset wiki
I thought it might have to do with changing the value
FILE* index
points to
不是指针本身的值被改变了。该指针指向一个结构(FILE
类型),该结构包含与 structure/pointer 关联的流的相关信息。据推测,该结构的一个成员包含一个指向下一个要读取的字节的 "cursor"。
或者它可能只是有一个文件描述符 int
(就像在许多 Unice 上一样)并且 I/O 函数只是调用内核以获得有关文件描述符的信息,包括当前位置。