文件:fstream,FILE,CFile,filesystem,以及路径目录
一、C++读写文件
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都有各自获取文件长度的函数)
四、C++17 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;
}