我想知道FILE
指针的操作f
以及函数是如何fputc
工作的。
首先,当我打开一个文件时(我还没有处理它,比如写或读)。在文件中的什么位置f
?是在第一个字符之前吗?
其次,当我使用:
fseek(f, -1, SEEK_CUR);
fputc(' ', f);
我的指针f
现在在什么位置?
我想知道FILE
指针的操作f
以及函数是如何fputc
工作的。
首先,当我打开一个文件时(我还没有处理它,比如写或读)。在文件中的什么位置f
?是在第一个字符之前吗?
其次,当我使用:
fseek(f, -1, SEEK_CUR);
fputc(' ', f);
我的指针f
现在在什么位置?
阅读手册应该会对您有所帮助。
For fopen
:流位于文件的开头。除了像这样的模式'a'
For fseek
: 那个函数可能会失败,你必须测试返回值;不难想象,您无法获得负偏移量。
打开文件时,当前位置是0
,第一个字符。
如果尝试fseek
在文件开头之前,fseek
将失败并返回-1
.
请注意,如果您在文本文件上向后搜索,则不能保证它会成功。在 linux 和/或二进制流上,假设您不在流的开头,在序列之后以写入模式打开真实文件
fseek(f, -1L, SEEK_CUR);
fputc(' ', f);
流的位置将与之前相同fseek
。
但是考虑一下这个看似简单的例子:
fputc('\n', f);
fseek(f, -1L, SEEK_CUR);
在诸如 Windows 之类的系统上,'\n'
在某些时候会在哪里转换为 2 个字节的序列,<CR><LF>
您认为它应该做什么?
由于所有这些失败的可能性(以及一些更奇特的可能性),您应该始终测试 的返回值fseek
并尽量减少其使用。
通过 C 访问文件时,首先需要有一种访问文件的方法。对于 C 文件 I/O,您需要使用 FILE 指针,它可以让程序跟踪正在访问的文件。例如:
FILE *fp;
要打开文件,您需要使用 fopen 函数,该函数返回一个 FILE 指针。打开文件后,可以使用 FILE 指针让编译器对文件执行输入和输出功能。
FILE *fopen(const char *filename, const char *mode);
这里文件名是字符串文字,您将使用它来命名您的文件和模式可以具有以下值之一
w - open for writing (file need not exist)
a - open for appending (file need not exist)
r+ - open for reading and writing, start at beginning
w+ - open for reading and writing (overwrite file)
a+ - open for reading and writing (append if file exists)
以下是 fseek() 函数的声明。
int fseek(FILE *stream, long int offset, int whence)
SEEK_SET Beginning of file
SEEK_CUR Current position of the file pointer
SEEK_END End of file
以下 fputc() 示例:
/* fputc example: alphabet writer */
#include <stdio.h>
int main ()
{
FILE * pFile;
char c;
pFile = fopen ("alphabet.txt","w");
if (pFile!=NULL) {
for (c = 'A' ; c <= 'Z' ; c++)
fputc ( c , pFile );
fclose (pFile);
}
return 0;
}
例如,如果您的文件指针位于第 100个 偏移量并且您写入fseek(f, -1, SEEK_CUR);
并且偏移量将位于第 99 个位置,然后您在第 99 个位置写入空间,则它取决于您当前的位置/偏移量,在使用fputc(' ', f);
文件指针的偏移量写入空间之后将是第 100个再次。