C++文件操作

基于C的文件操作 ,在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作 

一、流式文件操作

#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{
    FILE* fp; //创建文件指针
    errno_t err = fopen_s(&fp, "ss.txt", "w+"); //fopen_s打开文件成功返回0,失败返回非0的错误代码
    /*
    参数1:fp 文件指针
    参数2:要读写的文件
    参数3:模式
        r    以只读方式打开文件,该文件必须存在。
        r+    以可读写方式打开文件,该文件必须存在。
        rb+    读写打开一个二进制文件,允许读数据。
        rt+    读写打开一个文本文件,允许读和写。
        w    打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
        w+    打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
        a    以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到
        文件尾,即文件原先的内容会被保留。(EOF符保留) a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加
        到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) wb 只写打开或新建一个二进制文件;只允许写数据。 wb+ 读写打开或建立一个二进制文件,允许读和写。 wt+ 读写打开或着建立一个文本文件;允许读写。 at+ 读写打开一个文本文件,允许读或在文本末追加数据 ab+ 读写打开一个二进制文件,允许读或在文件末追加数据
*/ int a= fputc('X', fp);//向流写一个字符 //成功返回这个字符的ASCII吗,失败返回EOF int b = fseek(fp,0, SEEK_SET);//定位读写指针 /* 参数1:文件指针 参数2:偏移量--字符数 参数3:移动的基准 SEEK_SET 0 文件开头    SEEK_CUR 1 当前读写的位置    SEEK_END 2 文件尾部 返回值:成功返回0 */ rewind(fp); //把读写指针移到文件头 int c=fgetc(fp);//从流中读一个字符 /* 返回值:成功返回这个字符,失败返回EOF */ int e = fclose(fp);//关闭文件 //如果成功,返回0,失败返回EOF cout << c << endl; }

 

FILE* fp; 
    errno_t err = fopen_s(&fp, "ss.txt", "w+"); 
    char aa[] = "liming";
    int a=fputs(aa,fp);  //写一个字符串到流中
    //返回值:函数返回一个非负值,如果发生错误则返回 EOF
    rewind(fp); 

    char bb[10];
    char* c= fgets(bb,6,fp);  //从流中读一行或指定个字符
    /*
    参数1:用来保存数据的字符串
    参数2:最多读取n-1个字符,如果读取了一行(不包括行尾的'/n')
    参数3:文件指针
    返回值:如果成功则返回参数1的指针,否则返回NULL
    */
        
    int e = fclose(fp);
    
        cout << c << endl;

 

int a= fprintf(fp, "%s","Hahaha"); //按格式输入到流
    //其用法和printf()相同
char ss[10];
    
    //int b=fscanf_s(fp, "%s", ss, 8); //按格式从流中读取
    /*
    参数4:最多读取的字符数(注意:这个最多读取的字符数的大小是包括的末尾的('\0')NULL的)
    所以实际上最多可以读取的字符只有8-1=7个字符,
    由于参数3 %s 是读取一个单词,所以如果文件中能够读取的字符串长度
   大于9,那么fscanf_s不会向ss数组中读入任何内容,只将数组第一个元素赋值为'\0' 注意:单词间隔符:遇到空格、换行符才结束
*/ //与上面不同的是,我们在格式控制符%s这个加了一个宽度控制,意思是最多读取5个字符 int b = fscanf_s(fp, "%5s", ss, 8); //注意:参数4不要小于5 //此时最多读取5个字符,读写指针就在读取到的位置 cout << ss << endl; b = fscanf_s(fp, "%5s", ss, 8); cout << ss << endl; b = fscanf_s(fp, "%5s", ss, 8); cout << ss << endl;

 

int b = feof(fp);//检测是否已到文件尾,是返回真,否则返回0
#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{
    FILE* fp; 
    errno_t err = fopen_s(&fp, "ss.txt", "w+"); 
    int a[] = { 10,20,30,40,50,60,70,80 };
    int len = sizeof(a) / sizeof(a[0]);
    unsigned long num = fwrite(a, sizeof(a[0]), len, fp);//向流steam写数据 
        /*
        参数1:要写入的数组指针
        参数2:要被写入的每个元素的大小,以字节为单位-unsigned long
        参数3:元素的个数-unsigned long
        参数4:文件指针
        返回值:失败返回-1;成功返回写入的数据个数;
        */
        printf("写了%d个数据\n", num);
        
    int b[8];
    rewind(fp);
    num = fread(b, sizeof(int), 8, fp);//读取数据 
    /*
    参数1:用来保存数据的char*;注意大小要大于等于读取的字节数
    参数2:要读取的每个元素的大小,以字节为单位
    参数3:元素的个数
     参数4:文件指针
     返回值:失败返回-1;成功返回读取的数据个数
    */

    for (int i = 0; i < 8; i++) {
        printf("b[%d]=%d\n", i, b[i]);
    }
    printf("读了%d个数据\n", num);




    int n = fclose(fp);
    

}

 

    FILE* fp;
    fopen_s(&fp, "D:/bb/tu/sansui.jpg", "rb");//以二进制流方式读取图片到内存
    fseek(fp, 0, SEEK_END);
    long lSize = ftell(fp);  //返回指针位置

 

 

 

二、直接I/O文件操作 

这是C提供的另一种文件操作,它是通过直接存/取文件来完成对文件的处理,而上篇所说流式文件操作是通过缓冲区来进行;流式文件操作是围绕一个FILE指针来进行,而此类文件操作是围绕一个文件的"句柄"来进行,什么是句柄呢?它是一个整数,是系统用来标识一个文件(在WINDOWS中,句柄的概念扩展到所有设备资源的标识)的唯一的记号

 

【VS2017好像修改了,没有找到详细教程】

 

 

 

 

 

posted @ 2020-08-13 12:53  天子骄龙  阅读(430)  评论(0编辑  收藏  举报