文件:fstream,FILE,CFile,filesystem,以及路径目录

JSON文件

INI文件

转载:C++读入XML文件

转载:XML-Xercesc

压缩文件gzip

转载:理解open函数

转载:C++ fstream详解

一、C++读写文件

中文标准库:fstream

fstream禁止使用拷贝构造函数,如果函数的参数为fstream则需要使用std::move语句或者参数为fstream&

1. 判断打开文件是否成功:

if(fstream fs)

2. 打开文件

函数原型

void open (const char* filename,ios_base::openmode mode = ios_base::in | ios_base::out);
void open (const string& filename,ios_base::openmode mode = ios_base::in | ios_base::out);
void open (const wchar_t* _Filename, ios_base::openmode mode = ios_base::in | ios_base::out, int prot = ios_base::_Openprot);

参数解释

  • filename:打开的文件名

  • mode:打开文件的方式

模式 描述
ios::app 以追加的方式打开文件
ios::ate 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in 文件以输入方式打开(文件数据输入到内存)
ios::out 文件以输出方式打开(内存数据输出到文件)
ios::nocreate 不建立文件,所以文件不存在时打开失败
ios::noreplace 不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc 如果文件存在,把文件长度设为0,即以覆盖的方式写文件
  • prot:打开文件的属性(基本用不到)
port值 文件属性
0 普通文件,打开访问
1 只读文件
2 隐含文件
4 系统文件

可以用“|”或者“ + ”把以上属性连接起来,如"3"或"1 | 2"就是以只读和隐含属性打开文件

3. 读文件:>> , get(), getline(), read()

函数原型

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

int      get();
istream& get(char& c);
istream& get(char* s, streamsize n);
istream& get(char* s, streamsize n, char delim);
istream& get(streambuf& sb);
istream& get(streambuf& sb, char delim);

4. 写文件:<< , put(), write()

函数原型

ostream& put (char c);

ostream& write (const char* s, streamsize n);

5. 示例代码

#include <fstream>

int main()
{
	std::ifstream fr;
	std::ofstream fw;
	char word[200];

	fw.open("write.txt");
	fr.open("read.txt");

	fr >> word;                           //读取文件内容到word
	fw << "write file test" << std::endl; //将"write file test"写到文件write.txt

	fw.close();
	fr.close();

	return 0;
}

6. 设置指针位置

seekg seekp

7. 获取指针位置

tellp() tellg()

8. 读写csv文件(以逗号分隔)

点击查看代码
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

int main(int argc, char* argv[])
{
	//写文件
	std::ofstream ofs;
	ofs.open("fruit.csv", std::ios::out); // 打开模式可省略
	ofs << "Apple" << ',' << 5.5 << ',' << "2.2kg" << std::endl;
	ofs << "Banana" << ',' << 4.5 << ',' << "1.5kg" << std::endl;
	ofs << "Grape" << ',' << 6.8 << ',' << "2.6kg" << std::endl;
	ofs.close();

	//读文件
	std::ifstream ifs("fruit.csv", std::ios::in);

	std::string sub1;
	while (std::getline(ifs, sub1, ','))
	{
		std::cout << sub1 << std::endl;
	}

	std::cout << "-----第二种方式------" << std::endl;

	std::string line;
	std::string sub2;
	std::ifstream ifs2("fruit.csv", std::ios::in);  //此处需要重读一遍文件,因为前面的ifs已经读取完毕
	while (std::getline(ifs2, line))
	{
		std::stringstream ss(line);
		//std::vector<std::string> vec;可以用vector存储每一个字段,然后写到结构体中
		while (std::getline(ss, sub2, ','))  //注意此处第一个参数为stringstream类型
		{
			//vec.emplace_back(sub2);
			std::cout << sub2 << ",";
		}
		//struct.option = vec[0]
		std::cout << std::endl;
	}
	return 0;
}

二、C读写文件

FILE是C的标准文件读写

1. 打开文件 : fopen

FILE* fopen(const char* filename, const char* mode);filename是打开或新建的文件名,mode是访问模式

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r + 打开一个文本文件,允许读写文件。
w + 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a + 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

二进制文件访问模式为:"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

2.关闭文件:fclose

int fclose(FILE * fp);

如果成功关闭文件,fclose()函数返回,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量

三、Windows或Linux读写文件

#include <sys/stat.h>:获取文件的长度即字节数(windows和linux都可以使用,fstream和FILE都有各自获取文件长度的函数)

WriteFile

四、C++17 filesystem

中文标准库:filesystem

https://blog.csdn.net/qq_40946921/article/details/91394589

五、程序运行时所在的目录

#define _CRT_NONSTDC_NO_DEPRECATE //不定义该宏可以使用_getcwd(nullptr,0)获取路径

#include <iostream>
#include <direct.h> //linux下使用头文件 <unistd.h>

int main()
{
    char* path = getcwd(nullptr, 0);
    std::cout << path << '\n';
    return 0;
}
posted @ 2020-12-14 22:55  滴哒哒哒  阅读(367)  评论(0编辑  收藏  举报