当前位置:   article > 正文

C++文件操作(超详细!!!简单快速上手)_c++代码创建文件

c++代码创建文件

文件操作

读文件:把磁盘文件中的数据转移到内存中。   -------ofstream类

写文件:把内存中的数据转移到磁盘文件中。   --------ifstream类

读+写    ---------fstream类

一、写文本文件

    写文件的四个步骤:
    1、创建文件输出流对象
    2、打开文件
    3、向文件中写入数据
    4、关闭文件

代码:

  1. #include <iostream>
  2. #include <fstream> //文件操作类需要包含的头文件
  3. using namespace std;
  4. int main()
  5. {
  6. //STEP 1
  7. ofstream fout; //创建文件输出流对象
  8. //STEP 2
  9. fout.open("test.txt"); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容
  10. //STEP 3
  11. fout << "hello 1\n"; //向文件中写入数据
  12. fout << "hello 2\n";
  13. fout << "hello 3\n";
  14. //STEP 4
  15. fout.close(); //关闭文件,fout对象失效前会自动调用close()
  16. cout << "写文件操作完成!\n";
  17. system("pause");
  18. return 0;
  19. }

 效果:

 文件自动创建在项目文件下,一般自定义文件路径:

  1. string filename = "D:\\test.txt";
  2. fout.open(filename);

文件名一般用全路径,书写方法如下:
    1)"D:\test.txt"      //错误
    2)R"(D:\test.txt)"   //原始字面量,C++11标准  
    3)"D:\\test.txt"     //转义字符
    4)"D:/test.txt"      //把斜线反着写
    5)"/test.txt"        //Linux系统采用的方法 

STEP2也可以隐藏,在STEP1中,将原代码写为:

  1. //STEP1
  2. ofstream fout(filename);
  3. /*
  4. //STEP2
  5. ....
  6. */

 可以支持创建打开文件。

输出流打开文件的模式:
    ios::out   缺省值:会截断文件内容
    ios::trunc 截断文件内容
    ios::app   不截断文件内容,只在文件末尾追加文件
    ios::binary  以二进制方式打开文件

其中,默认值(不填=out=trunc),会直接覆盖原文件内容(if 有)。

代码实例(以app模式为例):

  1. #include <iostream>
  2. #include <fstream> //文件操作类需要包含的头文件
  3. using namespace std;
  4. int main()
  5. {
  6. //
  7. string filename = "D:\\test.txt";
  8. /*
  9. 打开文件的模式:
  10. ios::out 缺省值:会截断文件内容
  11. ios::trunc 截断文件内容
  12. ios::app 不截断文件内容,只在文件末尾追加文件
  13. */
  14. //STEP 1
  15. ofstream fout(filename,ios::app); //创建文件输出流对象
  16. //STEP 2
  17. //fout.open(filename); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容
  18. //STEP 3
  19. fout << "hello 1\n"; //向文件中写入数据
  20. fout << "hello 2\n";
  21. fout << "hello 3\n";
  22. //STEP 4
  23. fout.close(); //关闭文件,fout对象失效前会自动调用close()
  24. cout << "写文件操作完成!\n";
  25. system("pause");
  26. return 0;
  27. }

运行两次,效果:

在实际开发中,STEP3 紧着STEP2是不理智的,因为打开文件不一定成功。

需要加上一行代码判断:

  1. if (fout.is_open() == false) {
  2. cout << "打开文件失败\n";
  3. return 0;
  4. }

失败的原因主要有三种:

1、目录不存在

2、磁盘空间已满

3、没有权限,Linux平台下很常见

二、读取文本文件

读文件的四个步骤:
    1、创建文件输入流对象
    2、打开文件
    3、向文件中读取数据
    4、关闭文件

代码:

  1. #include <iostream>
  2. #include <fstream> //文件操作类需要包含的头文件
  3. #include <string>
  4. using namespace std;
  5. int main()
  6. {
  7. string filename = "D:\\test.txt";
  8. /*
  9. 输入流打开文件的模式:
  10. ios::in 缺省值
  11. */
  12. //STEP 1
  13. ifstream fin(filename,ios::in); //创建文件输入流对象
  14. if (fin.is_open() == false) {
  15. cout << "打开文件失败\n";
  16. return 0;
  17. }
  18. //STEP 3
  19. /*
  20. 读取文件内容的代码
  21. 文本文件一般以行的方式组织读取。-->getline()函数 (需要包含头文件 #include <string>)
  22. */
  23. string buffer; //用于存放从文件中读取的内容
  24. while (getline(fin, buffer)) { //从文本中读取一行数据存到buffer中,可使用循环读取全部数据,文件结束时getline()返回空
  25. cout << buffer << endl;
  26. }
  27. //STEP 4
  28. fin.close(); //关闭文件,fin对象失效前会自动调用close()
  29. cout << "读文件操作完成!\n";
  30. system("pause");
  31. return 0;
  32. }

以上是读取文件的第一种方法,下面介绍第二种方法,可以直接修改STEP3的部分,

  1. //STEP 3
  2. /*
  3. 读取文件内容的代码
  4. 文本文件一般以行的方式组织读取。-->getline()函数 (需要包含头文件 #include <string>)
  5. */
  6. // 第一种方法
  7. //string buffer; //用于存放从文件中读取的内容
  8. //while (getline(fin, buffer)) { //从文本中读取一行数据存到buffer中,可使用循环读取全部数据,文件结束时getline()返回空
  9. // cout << buffer << endl;
  10. //}
  11. // 第二种方法
  12. char buffer[101]; //存放从文件中读取的内容
  13. //注意:如果使用ifstream.getline(),一定要保证缓冲区足够大。
  14. while (fin.getline(buffer, 100)) {
  15. cout << buffer << endl;
  16. }

注意:如果使用ifstream.getline(),一定要保证缓冲区足够大。

 下面介绍第三种方法,推荐使用!

  1. //STEP 3
  2. /*
  3. 读取文件内容的代码
  4. 文本文件一般以行的方式组织读取。-->getline()函数 (需要包含头文件 #include <string>)
  5. */
  6. // 第一种方法
  7. //string buffer; //用于存放从文件中读取的内容
  8. //while (getline(fin, buffer)) { //从文本中读取一行数据存到buffer中,可使用循环读取全部数据,文件结束时getline()返回空
  9. // cout << buffer << endl;
  10. //}
  11. // 第二种方法
  12. //char buffer[101]; //存放从文件中读取的内容
  13. 注意:如果使用ifstream.getline(),一定要保证缓冲区足够大。
  14. //while (fin.getline(buffer, 100)) {
  15. // cout << buffer << endl;
  16. //}
  17. //第三种方法
  18. string buffer;
  19. while (fin >> buffer) {
  20. cout << buffer << endl;
  21. }

三、写二进制文件

雷同于写文本文件,代码如下:

  1. #include <iostream>
  2. #include <fstream> //文件操作类需要包含的头文件
  3. using namespace std;
  4. int main()
  5. {
  6. string filename = "D:\\test.dat";
  7. /*
  8. 打开文件的模式:
  9. ios::binary 以二进制方式打开文件
  10. */
  11. //STEP 1
  12. ofstream fout(filename, ios::app | ios::binary); //创建文件输出流对象 追加+二进制打开
  13. if (fout.is_open() == false) {
  14. cout << "打开文件失败\n";
  15. return 0;
  16. }
  17. //自定义一个结构体
  18. struct Student {
  19. char name[20];
  20. int age;
  21. double weight;
  22. }yyxzz;
  23. yyxzz = { "yyxzz",25,140.5 };
  24. //STEP 3
  25. //向文件中写入数据
  26. fout.write((const char*)&yyxzz, sizeof(Student));
  27. //STEP 4
  28. fout.close(); //关闭文件,fout对象失效前会自动调用close()
  29. cout << "写文件操作完成!\n";
  30. system("pause");
  31. return 0;
  32. }

主要注意点,1、打开文件时要用二进制打开方式
                      2、写入时要用write()方法

四、读二进制文件 

读二进制文件需要知道二进制的格式,以上述写二进制文件代码为例,读二进制文件代码如下:

  1. #include <iostream>
  2. #include <fstream> //文件操作类需要包含的头文件
  3. using namespace std;
  4. int main()
  5. {
  6. string filename = "D:\\test.dat";
  7. /*
  8. 输入流打开文件的模式:
  9. ios::in 缺省值
  10. ios::binary 二进制方式
  11. */
  12. //STEP 1
  13. ifstream fin(filename, ios::in| ios::binary); //创建文件输入流对象
  14. if (fin.is_open() == false) {
  15. cout << "打开文件失败\n";
  16. return 0;
  17. }
  18. //STEP 3
  19. //二进制文件以数据块(数据类型)的形式组织数据
  20. struct Student {
  21. char name[20];
  22. int age;
  23. double weight;
  24. }yyxzz; //需知道二进制格式
  25. while (fin.read((char*)&yyxzz, sizeof(yyxzz))) {
  26. cout << yyxzz.name << " " << yyxzz.age << " " << yyxzz.weight << endl;
  27. }
  28. //STEP 4
  29. fin.close(); //关闭文件,fin对象失效前会自动调用close()
  30. cout << "读文件操作完成!\n";
  31. system("pause");
  32. return 0;
  33. }

五、fstream类的使用

fstream可以用于读,也可以用于写,上述代码中,将对应的ifstream或ofstream替换为fstream即可,但是这种写法是C语言的写法,且目的不明确,开放的权限过多,所以尽量不要用。

六、文件的位置指针

1、获取文件的位置指针

ofstream类的成员函数是tellp();

ifstream类的成员函数是tellg();

fstream类两个都有,效果相同。

代码演示,以写入文件为例:

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main()
  5. {
  6. //STEP 1
  7. ofstream fout;
  8. //STEP 2
  9. fout.open("D:\\test.txt",ios::out);
  10. //STEP 3
  11. cout << fout.tellp() << endl; 打印位置指针
  12. fout << "hello 1\n"; 向文件中写入数据
  13. cout << fout.tellp() << endl;
  14. fout << "hello 12\n";
  15. cout << fout.tellp() << endl;
  16. fout << "hello 123\n";
  17. cout << fout.tellp() << endl;
  18. //STEP 4
  19. fout.close();
  20. cout << "写文件操作完成!\n";
  21. system("pause");
  22. return 0;
  23. }

效果展示:

2、移动文件位置指针

ofstream类的函数是seekp();

ifstream类的函数是seekg();

fstream类两个都有,效果相同。

方法一:

  1. std::istream& seekg(std::streampos_Pos);
  2. fin.seekg(128); 把文件指针移动到第128字节
  3. fin.seekp(128);
  4. fin.seekg(ios::beg); 把文件指针移动到文件的开始
  5. fin.seekp(ios::beg);
  6. fin.seekg(ios::end); 把文件指针移动到文件的结尾
  7. fin.seekp(ios::end);

方法二:

  1. std::istream& seekg(std::streamoff_Off,std::ios::seekdir_Way);
  2. 在ios中定义的枚举类型:eum seek_dir{beg,cur,end};
  3. beg----文件的起始位置 cur----文件的当前位置 end----文件的结尾位置
  4. fin.seekg(30,ios::beg); 从文件的开始位置往后移30字节
  5. fin.seekg(-5,ios::cur); 从文件的当前位置往前移5字节
  6. fin.seekg(-10,ios::end); 从文件的结尾位置往前移10字节

注意换行在文件中为\r\n,写入后可能会导致文件换行消失,例如:

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号