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好像修改了,没有找到详细教程】