ifstream seekg用法
    在C++中,文件是一种常用的数据存储方式。对于大部分的文件操作,我们都可以使用fstream流(即可以读或写)。但是在我们进行读操作时,则可能需要操作二进制文件。这时,我们就需要了解fstream中提供的一些工具函数,来帮助我们操作文件。
    seekg()函数是C++ STL库中提供的一个函数,它可以很方便地定位文件中的指定位置(指定偏移量)。本文将重点介绍seekg()函数的用法。
    第一步,需记住在头文件中引入<fstream>。
    第二步,我们需要使用fstream流打开一个文件。
    如果是读取文件,在打开文件时,我们可以使用文件指针(get指针)来标记当前读取位置。在读取完成后,该指针会自动指向下一个字符。如果要再次读取相同的位置,则需要使用seekg()函数重新设置位置。
    第三步,需要知道seekg()函数的在定位文件位置的时候参数的含义。
    具体参数请参见以下表格:
    参数值|含义
    -|-
    1|从文件起点开始向后移动一定的字节数
    2|从文件末尾开始向前移动一定的字节数
    0|从当前位置开始向后移动一定的字节数
    我们现在需要将文件指针移到文件头后面的第3个字节,可以采用以下代码:
    ```
    inFile.seekg(3);
    ```
    又若需要到文件末尾后面的第2字符处(也就是从文件末尾开始向前移动两个字符),则可以采用以下代码:
    ```
    inFile.seekg(-2,ios::end);
    ```
    ios::end用来标记参数中所取得位置的初始化位置是在文件结束后还是开始位置。
    第四步,我们知道了seekg()函数的参数含义,接下来我们需要了解该函数返回值的含义。
    当我们调用seekg()函数时,它会返回一个指针,该指针表示文件的当前位置。可以通过以下代码获得该指针。
    ```
    pos = llg();
    ```
    需要注意的是,在使用tellg()函数时,只能取得当前位置,不能改变文件指针的位置。
    第五步,完整的文件定位代码如下所示:
    ```
    ifstream inFile("");
    if (!inFile)
    {
    cout << "open file error" << endl;
    return 0;
    }
    inFile.seekg(5, ios::beg);  //从文件开始往后移动5位
    char str[20];
    inFile >> str;
    cout << "read str is:" << str << endl;
    inFile.close();
    ```
    在代码中,我们首先打开文件,然后将指针定位到从文件开始往后移动5位的位置。最后读取到该位置的字符串赋值给str变量并输出打印。我们需要关闭文件。
    本文中,我们主要介绍了C++ STL库中的seekg()函数。该函数可以方便地定位文件的指定位置,有助于我们更好地操作文件中的数据。在使用seekg()函数时,我们可以根据需要选择不同的参数值来定位文件位置,并通过tellg()函数获取当前的位置。在实际的编程过程中,我们需要根据实际需求来选择合适的读取方式,并合理地使用文件流,以免出现各种错误。
    除了在C++中的fstream流中使用seekg()函数进行文件定位,还有一些其他的文件定位函数可以使用。以下是一些常用的文件定位函数:
    1. fseek()
    该函数和seekg()函数的功能类似,只是使用方式略有不同。fseek()函数的用法如下所示:
    ```
    int fseek(FILE *stream, long offset, int origin);
    ```
    参数含义如下:
    - stream: 要操作的文件指针,一般是通过fopen()函数打开的文件,其中FILE* 是文件结构体。
    - offset: 相对于origin参数指定位置的偏移量,以字节为单位,可以是负数,正数代表往文件末尾偏移,负数代表往文件开始偏移。
    - origin:指出从哪个位置开始偏移,可以取三个值:SEEK_SET 表示从文件开始位置偏移,SEEK_CUR表示从文件当前位置偏移,SEEK_END表示从文件末尾位置偏移。
    举例来说,如果我们需要把文件偏移至文件末尾后面的10个字节,可以使用以下代码:
    ```
ftell函数用法
    FILE* fp = fopen("","r");
    fseek(fp, 10, SEEK_END); //定位文件指针到文件末尾后面的10个字节处
    fclose(fp);
    ```
    2. ftell()
    该函数和tellg()函数的作用非常类似,用于获取文件指针当前的位置。使用方式如下:
    ```
    long ftell(FILE *stream);
    ```
    例如:
    ```
    FILE* fp = fopen("","r");
    fseek(fp, 10, SEEK_END); //定位文件指针到文件末尾后面的10个字节处
    long pos = ftell(fp); // 获取当前文件指针的位置
    fclose(fp);
    ```
    需要注意的是,读写文件时需要先以字节为单位进行定位,然后按照需要读写相应的文件格式。对于二进制文件,我们应该根据需要分段读写,避免出现读写错误,导致程序运行异常。
    总结:在C++文件流中,文件定位函数是非常常用的工具函数。根据不同情况可以选择使用seekg()函数或者fseek()函数对文件进行定位,获取文件指针当前位置时使用tellg()函数或者ftell()函数。在进行文件读写时,我们应该保证按照正确的字节单位进行定位,尽可能避免读写错误,保证程序的稳定性和可靠性。