IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 文件I/O编程 -> 正文阅读

[C++知识库]文件I/O编程

一. 打开文件

1. open函数

int fd = open("./test2",O_RDWR);

./表示文件与代码在同一路径下,否则需要写具体路径

fd:文件描述符,失败返回-1,成功返回大于0的值

O_RDWR:读写

O_RDONLY:只读

O_WRONLY:只写

O_APPEND:追加

O_CREAT:没有文件创建文件

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int fd;
	//读写打开文件
	fd = open("./test2",O_RDWR);
	if(fd==-1)
	{
		printf("open file failed\n");
		//没有文件创建文件,并以读写方式打开
		fd=open("./test2",O_RDWR|O_CREAT,0600);
		if(fd>0)
		{
			printf("create test2 succeed\n");
		}
	}
	if(fd>0)
	{
		printf("open test2 succeed\n");
	}
    return 0;
}

二. 读文件

1. read读函数

int n_read = read(fd,readBuf,size);

n_read:返回实际读出的字节数

fd:文件描述符

readBuf:缓冲区,存放读出的内容,一般为char *类型

size:要读多少字符

2. lseek函数

用于移动光标

off_t lseek(int fd, off_t offset, int whence);

fd:文件描述符

whence详解
whence属性效果
SEEK_SET光标移动到offset处
SEEK_END光标移动到程序最后+offset的位置,offset可正可负
SEEK_CUR光标留在当前位置+offset的位置,offset可正可负
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int fd;
	//读写打开文件
	fd = open("./test2",O_RDWR);
	if(fd>0)
	{
		printf("open test2 succeed\n");
		char *readBuf;
        //给缓冲区开辟空间
		readBuf = (char *)malloc(sizeof(char)*fd+1);
        //计算文件中内容字节数
		int size = lseek(fd,0,SEEK_END);
        //移动光标回到开始位置
		lseek(fd,0,SEEK_END);
        //读出内容到缓冲区
		int n_read = read(fd,readBuf,size);
		printf("read: %d,context: %s\n",n_read,readBuf);
		close(fd);
	}
    return 0;
}

三. 写文件

1. write函数

像文件中写入内容,但是会从文件初始位置开始写,并覆盖原位置的内容。

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int fd;
	//读写打开文件
	fd = open("./test2",O_RDWR);
	if(fd>0)
	{
		printf("open test2 succeed\n");
		char *buf="test message";
		int n_write = write(fd,buf,strlen(buf));
		if(n_write!=-1)
			printf("write success\n");
		close(fd);
	}
    return 0;
}

2. O_APPEND追加内容

会将内容追加到文件最后,不会覆盖原有内容

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int fd;
	//读写打开文件
	fd = open("./test2",O_RDWR|O_APPEND);
	if(fd>0)
	{
		printf("open test2 succeed\n");
		char *buf="test message";
		int n_write = write(fd,buf,strlen(buf));
		if(n_write!=-1)
			printf("write success\n");
		close(fd);
	}
    return 0;
}

3. O_TRUNC替换内容

会删去原来所有的内容,替换成新的

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int fd;
	//读写打开文件
	fd = open("./test2",O_RDWR|O_TRUNC);
	if(fd>0)
	{
		printf("open test2 succeed\n");
		char *buf="test message";
		int n_write = write(fd,buf,strlen(buf));
		if(n_write!=-1)
			printf("write success\n");
		close(fd);
	}
    return 0;
}

例:向文件中写入结构体

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
struct node{
	int a;
	char c;
};
int main()
{
	int fd;
	struct node data[2] = {{100,'a'},{200,'c'}};
	struct node data2[2];
	//读写打开文件
	fd = open("./test2",O_RDWR);
	if(fd>0)
	{
		printf("open test2 succeed\n");
		int n_write = write(fd,&data,sizeof(struct node)*2);
		lseek(fd,0,SEEK_SET);
		int n_read=read(fd,&data2,sizeof(struct node)*2);
		printf("read %d %c\n",data2[0].a,data2[0].c);
		printf("read %d %c\n",data2[1].a,data2[0].c);
		close(fd);
	}
    return 0;
}

例:向文件中写入整数

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int fd;
	int data=10,data2;
	//读写打开文件
	fd = open("./test2",O_RDWR);
	if(fd>0)
	{
		printf("open test2 succeed\n");
		int n_write = write(fd,&data,sizeof(struct node)*2);
		lseek(fd,0,SEEK_SET);
		int n_read=read(fd,&data2,sizeof(struct node)*2);
		printf("read %d\n",data2);
		close(fd);
	}
    return 0;
}

四. 标准C库

1. fopen函数

FILE *fp = fopen("test.txt","权限")

文件读写权限说明
打开方式说明
"r"只读,文件不存在会打开失败
"w"写入,文件不存在创建文件,原文件内容会被全部删除
"a"追加,文件不存在创建文件,写入的数据追加到文件末尾
"r+"读写,可读可写,文件不存在打开失败,写入的数据会从头开始覆盖相应长度的原内容
"w+"读写,可读可写,文件不存在创建文件,原文件内容会被全部删除
"a+"追加可读,文件不存在创建文件,写入的数据追加到文件末尾

2. fwrite函数/fread函数

size_t fwrite(const void *ptr,size_t size,size_t number,FILE *stream);

size_t fread(const void *ptr,size_t size,size_t number,FILE *stream);

将ptr(数组或字符指针)中的内容写到stream中

size:每次写入/读出的字节大小

number:写/读多少次

例: fwrite(str,sizeof(char)*strlen(str),1,fp); //一次性全部写入

? ? ? ? fwrite(str,sizeof(char),strlen(str),fp);//每次写一个字符

#include<stdio.h>
#include<string.h>
int main()
{
	FILE *fp;
	char *str="test message";
	char readBuf[128]={0};

	fp=fopen("./test2","w+");
	//fwrite(str,sizeof(char),strlen(str),fp);//每次写入一个字符
	fwrite(str,sizeof(char)*strlen(str),1,fp);//一次性全部写入
	fseek(fp,0,SEEK_SET);
	//fread(readBuf,sizeof(char),strlen(str),fp);//每次读出一个字符
	fread(readBuf,sizeof(char)*strlen(str),1,fp);//一次性读出所有字符
	printf("read data :%s\n",readBuf);
	fclose(fp);
    return 0;
}

例: 向文件中写入结构体

#include<stdio.h>
#include<string.h>
struct node{
	int a;
	char c;
};
int main()
{
	FILE *fp;
	struct node data[2]={{3,'q'},{5,'w'}};
	struct node data2[2];

	fp=fopen("./test2","w+");
	//fwrite(str,sizeof(char),strlen(str),fp);
	fwrite(&data,sizeof(struct node)*2,1,fp);
	fseek(fp,0,SEEK_SET);
	//fread(readBuf,sizeof(char),strlen(str),fp);
	fread(&data2,sizeof(struct node)*2,1,fp);
	printf("read data :\n%d  %c\n",data2[0].a,data2[0].c);
	printf("%d  %c\n",data2[1].a,data[1].c);
	fclose(fp);
    return 0;
}

3. fputc,fgetc,feof

fputc:写入一个字符

fgetc:输出一个字符

feof:查看是否到达文件末尾

#include<stdio.h>
#include<string.h>
int main()
{
	FILE *fp;
	char *str = "test message";
	int i;
	int len = strlen(str);

	fp = fopen("./test2","w+");
	for(i=0;i<len;i++)
	{
		fputc(*str,fp);
		str++;
	}

	fclose(fp);
	fp = fopen("./test2","r+");
	while(!feof(fp))
	{
		printf("%c",fgetc(fp));
	}
	printf("\n");
	fclose(fp);
    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2022-04-22 18:17:37  更:2022-04-22 18:22:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:38:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码