C++IO流文件指针

预编译器内置宏

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

调用

void ioStreamPoint() {
    char write_buf[32] = "Hello Word !!";
    //fd是当前文件的的标示
    int fd;
    //O_RDWR 可读写 O_CREAT 创建 O_TRUNC 文件清空
    //open导入的是#include 和#include 两个头
    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++,Android,程序员学,C++,文件指正,IO流,C++)