我想知道FILE
指针f
的操作以及函数fputc
的工作原理。
首先,当我打开一个文件时(我还没有开始工作,比如写作或阅读)。 f
在文件中的位置是什么?它是在第一个角色之前吗?
其次,当我使用时:
fseek(f, -1, SEEK_CUR);
fputc(' ', f);
我的指针f
现在处于什么位置?
答案 0 :(得分:2)
阅读手册应该对你有帮助。
对于fopen
:流位于文件的开头。除了像'a'
对于fseek
:该函数可能失败,您必须测试返回值;并且不难想象你不能获得负偏移。
答案 1 :(得分:1)
当您打开文件时,当前位置为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
的返回值并尽量减少其使用。
答案 2 :(得分:1)
通过C访问文件时,首先必须要有办法访问文件。对于C文件I / O,您需要使用FILE指针,这将使程序跟踪正在访问的文件。例如:
FILE *fp;
要打开文件,您需要使用fopen函数,该函数返回FILE指针。一旦打开文件,就可以使用FILE指针让编译器对文件执行输入和输出功能。
FILE *fopen(const char *filename, const char *mode);
此处filename是字符串文字,您将使用它来命名文件,模式可以具有以下值之一
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;
}
答案 3 :(得分:0)
如果您的文件指针位于第100个 偏移并且您编写fseek(f, -1, SEEK_CUR);
并且偏移量将是以下,则取决于您当前的位置/偏移量第99个位置,然后在第99个位置写入空格,在使用fputc(' ', f);
文件指针的偏移量写入空格后,将再次 100次。