我正在尝试获取一个关于如何写入文件的示例程序:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv){
char buff[1024];
size_t len, idx;
ssize_t wcnt;
for (;;){
if (fgets(buff,sizeof(buff),stdin) == NULL)
return 0;
idx = 0;
len = strlen(buff);
do {
wcnt = write(1,buff + idx, len - idx);
if (wcnt == -1){ /* error */
perror("write");
return 1;
}
idx += wcnt;
} while (idx < len);
}
}
所以我的问题是这样的:假设我想写入一个 20000 字节的文件,因此每次我只能写入(最多)1024(缓冲区大小)。
假设在我第一次尝试时一切顺利,fgets() 读取了 1024 个字节,并且在我的第一个 do while 中我写入了 1024 个字节。
然后,由于我们写入了“len”个字节,因此我们退出 do-while 循环。
那么现在怎么办??根据我们之前的读取,缓冲区已满。 在我看来,由于某种原因,这意味着 fgets() 现在将从上次在文件中到达的点继续读取。(此处为 buf[1024])。
fgets() 怎么知道它在文件中停止读取的位置?
我检查了手册页:
fgets() 从流中读取最多一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。读取在 EOF 或换行符后停止。如果读取了换行符,则将其存储在缓冲区中。终止空字节 (aq\0aq) 存储在缓冲区中的最后一个字符后。fgets
() 在成功时返回 s,在错误时或当文件末尾发生且未读取任何字符时返回 NULL。*
因此从那里,我得到它返回一个指向 buf 第一个元素的指针,它始终是 buf[0],这就是我感到困惑的原因。