精华内容
下载资源
问答
  • C/C++文件指针偏移

    2019-10-09 05:29:07
    参数含义:fp 文件指针 offset 相对于origin规定的偏移位置量 origin 指针移动的起始位置,可设置为以下三种情况: SEEK_SET 文件开始位置 SEEK_CUR 文件当前位置 SEEK_END 文件结束位置 C++中seep()和seekg...

    C语言中fseek()的功能:

    函数原型:int fseek(FILE *fp, LONG offset, int origin)

    参数含义:fp 文件指针 offset 相对于origin规定的偏移位置量 origin 指针移动的起始位置,可设置为以下三种情况: SEEK_SET 文件开始位置 SEEK_CUR 文件当前位置 SEEK_END 文件结束位置


    C++中seep()和seekg()函数功能

    seekp:设置输出文件流的文件流指针位置
    seekg:设置输入文件流的文件流指针位置


    函数原型:
    ostream& seekp( streampos pos );
    ostream& seekp( streamoff off, ios::seek_dir dir );
    istream& seekg( streampos pos );
    istream& seekg( streamoff off, ios::seek_dir dir );

    函数参数
    pos:新的文件流指针位置值
    off:需要偏移的值
    dir:搜索的起始位置
    dir参数用于对文件流指针的定位操作上,代表搜索的起始位置
    在ios中定义的枚举类型:
    enum seek_dir {beg, cur, end};
    每个枚举常量的含义:
    ios::beg:文件流的起始位置
    ios::cur:文件流的当前位置
    ios::end:文件流的结束位置


    转载于:https://www.cnblogs.com/meihao1203/p/8861446.html

    展开全文
  • C++文件操作指针移动-----off_t

    千次阅读 2011-12-24 22:00:36
    readfile.seekg(-3*sizeof(person),ios_base::cur); ===> readfile.seekg(-3*(off_t)sizeof(person),ios_base::cur); sizeof()返回的size_t是无符号的, 而off_t是有符号的 ... ------该语句没有移动

    readfile.seekg(-3*sizeof(person),ios_base::cur);
    ===>
    readfile.seekg(-3*(off_t)sizeof(person),ios_base::cur);

    sizeof()返回的size_t是无符号的,
    而off_t是有符号的

     

    f.seekg(-3*sizeof(s),ios::cur);  ------该语句没有移动效果

     

    f.seekg(-3*(off_t)sizeof(s),ios::cur);--------该语句才有移动的效果。 

     

    所以,要把移动量强转为off_t类型方可,off_t返回有符号,size_t返回的是无符号。具体为什么我还在查。嘻嘻

     

    查到了:因为sizeof()返回的类型是size_t类型,其真实类型是unsigned ,属于无符号类型,所以在一些编译器下面,比如gcc g++中,正负都会是正,即-3到头还是3,所以转成了off_t类型,off_t是long int 类型,具有正负区别,所以,有用。

    展开全文
  • C++ 移动和获取文件读写指针

    千次阅读 2020-03-18 08:54:17
    在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。 ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件指针的位置; ofstream 类和 fstream...

    在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。

    	ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置;
    	
    	ofstream 类和 fstream 类有 seekp 成员函数,可以设置文件写指针的位置。
    

    所谓“位置”,就是指距离文件开头有多少个字节。文件开头的位置是 0。

    这两个函数的原型如下:

    ostream & seekp (int offset, int mode);
    istream & seekg (int offset, int mode);
    

    mode 代表文件读写指针的设置模式,有以下三种选项:
    1 . ios::beg:让文件读指针(或写指针)指向从文件开始向后的 offset 字节处。offset 等于 0 即代表文件开头。在此情况下,offset 只能是非负数。

    2 . ios::cur:在此情况下,offset 为负数则表示将读指针(或写指针)从当前位置朝文件开头方向移动 offset 字节,为正数则表示将读指针(或写指针)从当前位置朝文件尾部移动 offset字节,为 0 则不移动。

    3 . ios::end:让文件读指针(或写指针)指向从文件结尾往前的 |offset|(offset 的绝对值)字节处。在此情况下,offset 只能是 0 或者负数。

    此外,我们还可以得到当前读写指针的具体位置:

    	ifstream 类和 fstream 类还有 tellg 成员函数,能够返回文件读指针的位置;
    	
    	ofstream 类和 fstream 类还有 tellp 成员函数,能够返回文件写指针的位置。
    

    这两个成员函数的原型如下:

    int tellg();
    int tellp();
    

    要获取文件长度,可以用 seekg 函数将文件读指针定位到文件尾部,再用 tellg 函数获取文件读指针的位置,此位置即为文件长度。

    假设学生记录文件 students.dat 是按照姓名排好序的,编写程序,在 students.dat 文件中用折半查找的方法找到姓名为 Jack 的学生记录,并将其年龄改为 20(假设文件很大,无法全部读入内存)。程序如下:

    #include <iostream>
    #include <fstream>
    #include <cstring>
    using namespace std;
    class CStudent
    {
        public:
            char szName[20];
            int age;
    };
    int main()
    {
        CStudent s;       
        fstream ioFile("students.dat", ios::in|ios::out);//用既读又写的方式打开
        if(!ioFile) {
            cout << "error" ;
            return 0;
        }
        ioFile.seekg(0,ios::end); //定位读指针到文件尾部,
                                  //以便用以后tellg 获取文件长度
        int L = 0,R; // L是折半查找范围内第一个记录的序号
                      // R是折半查找范围内最后一个记录的序号
        R = ioFile.tellg() / sizeof(CStudent) - 1;
        //首次查找范围的最后一个记录的序号就是: 记录总数- 1
        do {
            int mid = (L + R)/2; //要用查找范围正中的记录和待查找的名字比对
            ioFile.seekg(mid *sizeof(CStudent),ios::beg); //定位到正中的记录
            ioFile.read((char *)&s, sizeof(s));
            int tmp = strcmp( s.szName,"Jack");
            if(tmp == 0) { //找到了
                s.age = 20;
                ioFile.seekp(mid*sizeof(CStudent),ios::beg);
                ioFile.write((char*)&s, sizeof(s));
                break;
            }
            else if (tmp > 0) //继续到前一半查找
                R = mid - 1 ;
            else  //继续到后一半查找
                L = mid + 1;
        }while(L <= R);
        ioFile.close();
        return 0;
    }
    
    展开全文
  • C++IO流文件指针

    千次阅读 2018-09-01 12:17:34
    2.逻辑其实就是将文件指针移动到结尾(SEEK_END),然后使用(SEEK_CUR)的出到文件头的距离,即文件大小。 3.read方法也可以返回实际读取到的文件大小(str)。 int my_read( int fd) //读数据函数 { ...

    预编译器内置宏

    __LINE__    行数
    __TIME__    时间
    __FUNCTION__   函数
    __FINE__     文件名

    调用

    void ioStreamPoint() {
        char write_buf[32] = "Hello Word !!";
        //fd是当前文件的的标示
        int fd;
        //O_RDWR 可读写 O_CREAT 创建 O_TRUNC 文件清空
        //open导入的是#include <io.h>和#include <fcntl.h>两个头
        if ((fd = open("../example_63.c", O_RDWR | O_CREAT | O_TRUNC)) ==-1)
            my_err("open", __LINE__);
        else {
            printf("Creat file success !!\n");
        }
        //写入文件,write 的返回值是实际写入的字节数
        if (write(fd, write_buf, strlen(write_buf)) != strlen(write_buf)) 
            my_err("write", __LINE__);
        int ret = my_read(fd);
        printf("my_read . ret = %d\n", ret);
    
        printf("/*-----------------继续写入write_buf-------------------*/\n") ;
        if(lseek(fd,10,SEEK_END)== -1) //从文件结尾处向后移动10位
            my_err("lseek",__LINE__) ; //_LINE_  预编译器内置宏,表示行数
        if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //写入文件,write 的返回值是实际写入的字节数
            my_err("write",__LINE__) ;
    }

    my_read 函数 :

    1.实际它必须在ioStreamPoint之前申明
    2.逻辑其实就是将文件指针先移动到结尾(SEEK_END),然后使用(SEEK_CUR)的出到文件头的距离,即文件大小。
    3.read方法也可以返回实际读取到的文件大小(str)。

    int my_read(int fd) //读数据函数
    {
        int len;
        int ret;
        int i;
        char read_buf[64];
        if ((lseek(fd, 0, SEEK_END)) == -1) //移动文件指针到结尾
            my_err("lseek", __LINE__); //__LINE__  预编译器内置宏,表示行数
        if ((len = lseek(fd, 0, SEEK_CUR)) == -1) //求相对于文件开头的偏移量,用于表明文件开始处到文件当前位置的字节数 len
            my_err("lseek", __LINE__);
        if ((lseek(fd, 0, SEEK_SET)) == -1) //移动文件指针到开头
            my_err("lseek", __LINE__);
        printf(" 字节数是 : %d \n", len);
        if ((ret = read(fd, read_buf, len)) < 0) //成功时返回实际读到的字节数,失败返回 -1
            my_err("read", __LINE__);
        for (i = 0; i < len; i++)
            printf("%c", read_buf[i]);
        printf("\n");
        return ret;
    }
    

    my_err:输出错误提示

    void my_err(const char *err_string, int line) {
        //fprintf()函数根据指定的格式(format)向输出流(stream)写入数据,把后面的写到前面
        fprintf(stderr, "line:%d ", line); 
        perror(err_string);//先输出err_string ,再输出错误原因
        exit(1);
    }
    

    输出结果:

    Creat file success !!
    字节数是 : 13
    Hello Word !!
    my_read . ret = 13
    /*-----------------再次写入write_buf-------------------*/
     字节数是 : 36
    Hello Word !!          Hello Word !!

    方式二:

    文件流提供以下成员函数来读取或配置文件指针:

    tellg()      返回读取文件指针的当前位置
    tellp()      返回写入文件指针的当前位置
    seekg(指针偏移量)      将读取文件指针移到指定位置
    seekg(指针偏移量,参照位置)      将读取文件指针移到指定位置
    seekp(指针偏移量)      将写入文件指针移到指定位置
    seekp(指针偏移量,参照位置)  将写入文件指针移到指定位置
    这些成员函数名和参数,容易混淆,下面就简单解释一下:
    
    备注:以上函数中的最后一个字母不是g就是p,代表什么意思呢?其中,g代表get,表示读取;p代表put,表示写入。
    另外,函数参数中的“文件中的位置”和“指针偏移量”为 long整型,以字节为单位。“参照位置”是一个有以下值的枚举:
    ios::beg      文件开头计算偏移量
    ios::cur      文件当前位置计算偏移量
    ios::end      文件结尾计算偏移量

    实例

        ifstream fs_in;
        fs_in.open("../example_63.c",ios::in);
        if (!fs_in) my_err("read", __LINE__);
        char buff[1024] = {0};
        //通过getline函数读取字符串
        fs_in.getline(buff, 1024);        
        cout << "buff = " << buff << endl;
        fs_in.seekg(ios::end);
        long size = fs_in.tellg();
        cout << "文件大小:" << size << endl;
        fs_in.close();

    输出:
    1.并没有预期的32字节
    2.getline方法遇到‘\0’将会停止读取。

    buff = Hello Word !!
    文件大小:2

    总结:

    1.文件指针能帮助我们继续添加内容,而避免覆盖。
    2.文件指针能得到文件的大小
    3.fcntl.h更加简单的操作IO流。

    展开全文
  • C/C++:文件读写之文件指针定位

    万次阅读 2018-03-10 19:21:06
    问题描述 文件读写时C/C++使用过程中最为常见也最为平凡...为了更方便介绍,本文使用将文件指针移动到文件开头作为示例。 示例文件 test.txt 1 Hello 2 World 代码功能 打开一次文件,并重复读写两次。 代...
  • //中间有读写文件操作 int i; i = file.tellg(); file >> str1; file.seekg(i); file >> str2; ``` 请问 这两个 str为什么不一样 我确认 在file>>str1和file>>str2这两个语句之前 seekg() 返回的值是一样的
  • C++文件操作中如何在不刷新内容下从头写入数据?用ios::out和app后无法用seekp(0l,ios::beg)移动指针到开头啊,求解怎么办???
  • C++——文件指针定位--fseek,ftell

    千次阅读 2016-03-22 21:46:31
    #include &lt;iostream&gt; using namespace std; void main() { FILE *fp=fopen("...//最开始时,指针的初始位置为0,即文件的开始位置 cout&lt;&lt;fgetc(fp)&lt;&lt;end
  • 目录 简介 示例 代码 输出 创建 定义删除器 示例 处理数组 销毁其他资源 ...隐式指针转换 ...共享指针shared_ptr是具有共享所有权语义的智能指针。 每当共享指针shared_ptr的最后一个所有者...
  • C++11标准库提供的唯一指针unique_ptr有助于避免发生异常时的资源泄漏。它实现了专有所有权的概念,这意味着它可以确保一个对象及其关联资源一次只能由一个指针"拥有''。当此所有者被销毁或变空或开始拥有另一个对象...
  • 主要函数:指针定位函数SetFilePointer,读文件ReadFile,写文件WriteFile。 首先使用CreateFile创建文件,SetFilePointer函数将指针定位到文件指定位置(tail),从这个位置开始调用WriteFile函数写入内容(text)...
  • c++ 智能指针及 循环引用问题

    万次阅读 多人点赞 2014-04-07 13:36:05
    c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有... 智能指针在 标头文件的 std 命名空间中定义
  • C++函数指针和std::function对象

    千次阅读 2018-10-08 22:22:02
    C++函数指针和std::function对象 这篇博文中通过实现对String字符串大小写转换为列来说明C++中函数指针和std::function对象的使用。 我们在博文《C++实现一个简单的String类》中的自定义的String类为基础,再添加两...
  •  #include #include #include ... //这里使用了seekg()来使文件指针重新定位到头部, 也可以写成in.seek(0);  out ;  }  in.close();  out.close();  return 0; }
  • 调整指针位置时需要在seekg函数前加上clear函数 i = file.tellg(); file &amp;amp;gt;&amp;amp;gt; str1; file.clear(); //添加clear函数 file.seekg(i); file &amp;amp;gt;&amp;amp;gt; str2;...
  • C++ STL 四种智能指针

    万次阅读 多人点赞 2018-08-07 11:25:13
    STL一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr和weak_ptr,auto_ptr是C++98提供的解决方案,C+11已将将其摒弃,并提出了unique_ptr作为auto_ptr替代方案。虽然auto_ptr已被摒弃,但在实际项目...
  • c++文件操作大全

    万次阅读 多人点赞 2019-01-17 15:43:06
    c++文件操作大全 基于C的文件操作  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义...
  • C++指针

    千次阅读 2006-12-25 12:19:00
    第7章 指针1.教学内容(1)指针指针变量的概念,指针变量的定义、赋值与引用,指针变量的运算。(2)数组指针与数组指针变量的概念,一维数组元素地址的三种表示方式,一维数组元素值的四种表示方式及应用举例。...
  • 待读入文件 1.greenteemo 2.csdn 3.blog 代码,详细说明见注释 #include <stdio.h> #define LENGTH_OF_LINE 1024 int main(){ FILE *fp = fopen("file.txt", "r"); // 打开文件 char line[LENGTH_OF_...
  • C++ 智能指针--内存泄露的惨痛经历

    千次阅读 2019-04-01 21:01:21
    title: “C++ 指针” subtitle: “避免 C++ 内存泄露的惨痛经历” date: 2019-04-1 author: Mcoder header-img: img/JCQ_0383-Pano.jpg catalog: true tags: C++ memory Smart Pointer 引言 最近在敲...
  • 使用fstream的getline函数后,如果没能读完一行,无论哪个重载,都会把该fstream的文件指针跳到-1。 怎么办?
  • C/C++文件操作(一):FILE指针

    万次阅读 2008-12-29 15:00:00
    语言文件系统称为流文件(Stream),正文流(正文文件),二进制流(二进制文件) 缓冲与非缓冲文件 顺序操作文件与随机操作文件 顺序文件:读/写第K个数据块之前必须读/写... 一、文件操作的一般过程 定义文件指针 FIL
  • C++ 文件的随机读写

    2021-05-21 04:16:55
    C++ 文件的随机读写.
  • 本篇文章主要讲解C++中的文件操作的相关简介。 一.C++文件简介 c++支持以下两种文件类型: ...要访问一个文件,我们需要创建一个文件指针。声明方式为:FILE* fp; 指针fp指向FILE结构,用于存放文件信
  • 【C/C++】C语言的指针总结

    万次阅读 多人点赞 2019-08-28 15:46:13
    文章目录基础部分关于内存物理存储器和存储地址空间关于内存地址指针指针变量指针变量的定义和使用通过指针间接修改变量的值指针大小野指针和空指针万能指针voidconst修饰的指针变量指针和数组数组名指针操作数组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,425
精华内容 22,970
关键字:

c++文件指针移动

c++ 订阅