0

我想知道FILE指针的操作f以及函数是如何fputc工作的。

首先,当我打开一个文件时(我还没有处理它,比如写或读)。在文件中的什么位置f?是在第一个字符之前吗?

其次,当我使用:

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

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

4

4 回答 4

2

阅读手册应该会对您有所帮助。

For fopen:流位于文件的开头。除了像这样的模式'a'

For fseek: 那个函数可能会失败,你必须测试返回值;不难想象,您无法获得负偏移量。

于 2016-01-03T16:25:57.133 回答
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并尽量减少其使用。

于 2016-01-03T16:29:01.087 回答
1
  • 通过 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;
       }
    
于 2016-01-04T07:18:16.987 回答
0

例如,如果您的文件指针位于第 100个 偏移量并且您写入fseek(f, -1, SEEK_CUR);并且偏移量将位于第 99 个位置,然后您在第 99 个位置写入空间,则它取决于您当前的位置/偏移量,在使用fputc(' ', f);文件指针的偏移量写入空间之后将是第 100个再次。

于 2016-01-03T20:38:14.463 回答