关于FILE *流以及fputc()的工作原理

时间:2016-01-03 16:19:01

标签: c file-pointer

我想知道FILE指针f的操作以及函数fputc的工作原理。

首先,当我打开一个文件时(我还没有开始工作,比如写作或阅读)。 f在文件中的位置是什么?它是在第一个角色之前吗?

其次,当我使用时:

fseek(f, -1, SEEK_CUR);
fputc(' ', f);

我的指针f现在处于什么位置?

4 个答案:

答案 0 :(得分:2)

阅读手册应该对你有帮助。

对于fopen:流位于文件的开头。除了像'a'

这样的模式

对于fseek:该函数可能失败,您必须测试返回值;并且不难想象你不能获得负偏移。

答案 1 :(得分:1)

当您打开文件时,当前位置为0位于第一个字符

如果您在文件开头之前尝试fseekfseek将失败并返回-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次