C 语言中控制文件的读取或写入光标

在 C 语言中,文件操作时控制文件的读取/写入光标或位置,可以通过一些标准函数来实现。文件操作中控制光标的函数主要有 fseek(), ftell(), 和 rewind()。这些函数可以帮助你控制文件中数据的读写位置。

1. fseek() 函数

fseek() 函数用于设置文件指针的位置。它允许你在文件中的任意位置进行读写操作。

复制代码
int fseek(FILE *stream, long int offset, int whence);
  • stream:指向文件的指针。
  • offset :距离 whence 位置的偏移量,单位是字节。
  • whence :指定偏移的起始位置,常用的值有:
    • SEEK_SET:文件开头(偏移量 offset 从文件开头计算)。
    • SEEK_CUR:当前位置(偏移量 offset 从当前文件指针位置计算)。
    • SEEK_END:文件结尾(偏移量 offset 从文件结尾计算)。

返回值 :返回 0 表示成功,返回 -1 表示失败。

示例:fseek() 使用
复制代码
#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r+");  // 打开文件进行读写
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    // 将文件指针移动到文件的第10个字节处
    fseek(file, 10, SEEK_SET);
    
    char ch = fgetc(file);
    printf("Character at position 10: %c\n", ch);

    fclose(file);
    return 0;
}

解释

  • fseek(file, 10, SEEK_SET) 将文件指针移动到文件的第 10 个字节处。
  • 然后通过 fgetc() 读取该位置的字符。

2. ftell() 函数

ftell() 函数用于返回当前文件指针的位置,即文件中当前读取或写入位置的字节偏移量。

复制代码
long ftell(FILE *stream);
  • stream:指向文件的指针。

返回值 :返回当前文件指针的位置(以字节为单位)。如果出错,返回 -1

示例:ftell() 使用
复制代码
#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");  // 以只读模式打开文件
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    // 读取前 5 个字符
    char buffer[6];
    fread(buffer, sizeof(char), 5, file);
    buffer[5] = '\0';  // 添加字符串结束符

    printf("Buffer content: %s\n", buffer);

    // 获取当前文件指针的位置
    long pos = ftell(file);
    printf("Current file pointer position: %ld\n", pos);

    fclose(file);
    return 0;
}

输出

复制代码
Buffer content: Hello
Current file pointer position: 5

解释

  • ftell(file) 返回当前文件指针的位置。假设文件最初的指针位置在文件的开头,读取 5 个字符后,文件指针会移动到第 6 个字节位置,因此 ftell() 返回 5。

3. rewind() 函数

rewind() 函数将文件指针移动到文件的开头,并清除文件的错误标志。

复制代码
void rewind(FILE *stream);
  • stream:指向文件的指针。

返回值 :此函数无返回值,操作成功或失败由 ferror() 来检测。

示例:rewind() 使用
复制代码
#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");  // 以只读模式打开文件
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    // 读取前 5 个字符
    char buffer[6];
    fread(buffer, sizeof(char), 5, file);
    buffer[5] = '\0';  // 添加字符串结束符

    printf("Buffer content: %s\n", buffer);

    // 将文件指针移动到文件开头
    rewind(file);

    // 重新读取文件的第一个字符
    char ch = fgetc(file);
    printf("First character after rewind: %c\n", ch);

    fclose(file);
    return 0;
}

输出

复制代码
Buffer content: Hello
First character after rewind: H

解释

  • 在调用 rewind(file) 后,文件指针被重新设置到文件的开头。
  • 然后,我们通过 fgetc() 读取文件的第一个字符。

4. 常见用法总结

  • fseek():将文件指针移动到文件中的任意位置。可以使用偏移量来指定移动的距离。
  • ftell():返回当前文件指针的位置。常用于记录文件指针的当前位置,以便稍后返回。
  • rewind():将文件指针移动到文件的开头,并清除文件的错误标志。适用于在文件读取完成后需要重读的情况。

5. 相关错误处理

文件操作中的常见错误处理包括:

  • 使用 ferror() 检查文件操作中是否发生错误。

  • 使用 feof() 检查是否到达文件的末尾。

    int ferror(FILE *stream); // 检查文件操作错误
    int feof(FILE *stream); // 检查是否到达文件末尾

总结

  • fseek()ftell()rewind() 是 C 语言中文件操作中非常有用的函数,用来控制和获取文件指针的位置。
  • 使用这些函数可以精确地控制读取和写入的文件位置,尤其是在处理大文件或需要多次遍历文件的情况下。
相关推荐
爱coding的橙子2 小时前
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
算法·leetcode
码上淘金3 小时前
【Python】Python常用控制结构详解:条件判断、遍历与循环控制
开发语言·python
Brilliant Nemo3 小时前
四、SpringMVC实战:构建高效表述层框架
开发语言·python
格林威4 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
橙子199110164 小时前
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
android·开发语言·kotlin
androidwork5 小时前
Kotlin Android LeakCanary内存泄漏检测实战
android·开发语言·kotlin
学地理的小胖砸5 小时前
【Python 基础语法】
开发语言·python
?abc!6 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue6 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
DanB246 小时前
Java笔记4
java·开发语言·笔记