【C++之文件与文件流】f1.dat 和 f2.dat 文件的读写
題目要求
建立兩個磁盤文件 f1.dat 和 f2.dat ,編程序實現以下工作:
(1)從鍵盤輸入20個整數,分別存放在兩個磁盤文件中(每個文件存放10個);
(2)從 f1.dat 中讀入10個數,然后存放到 f2.dat 文件原有數據的后面;
(3)從 f2.dat 中讀入20個整數,對它們按從小到大的順序存放到 f2.dat (不保留原來的數據)。
——譚浩強的《C++面向對象程序設計》第7章習題第4小題
文件
文件是指存儲在磁盤類介質上的相關數據的集合, 也稱磁盤文件。
程序設計中涉及到的文件主要由兩類,一類是程序文件,包括源程序文件、目標文件和可執行文件;另一類是數據文件,即程序輸入輸出的存儲對象,涉及輸入輸出數據和中間結果。
根據文件中數據的表示形式,文件又分為ASCII文件和二進制文件。ASCII文件就是文本文件,每個字節表示一個字符。二進制文件是把內存中的數據、指令按其在內存中的原始格式存放在磁盤上。
文件流
在C++的I/O類庫里定義了幾種文件流類,專門用于文件的輸入和輸出操作:
- ifstream類,支持從磁盤文件輸入
- ofstream類,支持向磁盤文件輸出
- fstream類,支持對磁盤文件輸出和輸出
要實現對文件進行輸入輸出,必須定義一個文件流類對象,用對象調用類的成員函數對文件操作,完成程序與磁盤文件之間的數據傳輸和交換。
對文件的操作
1.文件的打開與關閉
打開文件有兩種實現方法:
(1)建立文件流對象,用對象調用類成員函數open。
格式:
- 文件名可以包括路徑,如省略路徑,默認文件在當前目錄(工程文件目錄)。
- 輸入輸出方式是在ios類中定義的枚舉常量,有多種選擇。
(2)在定義文件流對象時指定參數(在構建流對象的同時打開對應文件)
格式:
- 打開文件操作可能成功也可能失敗,可以測試文件流對象判定。文件流對象是真,表示成功;否則表示失敗。
例如:
以寫的方式打開文件 f1.dat
或者:
fstream outfile("f1.dat", ios::out);關閉磁盤文件
- 文件使用完畢,必須關閉文件,用文件流對象調用關閉文件成員函數實現。
- 格式: 文件流對象.close();
- 功能:解除文件流對象與磁盤文件的關聯,防止文件數據被意外修改。
2.讀寫ASCII碼文件
可以通過提取、插入運算符(>>、<<)和調用類的成員函數 (put、 get、getline等) 兩種方法。
例如:
for (int i = 0; i < 10; i++) {cin >> a[i]; // 輸入10個數存放到outfile1文件中outfile1 << a[i] << " "; }程序1
/* ************************************************************************* @file: main.cpp @date: 2020.12.26 @author: Xiaoxiao @brief: 從鍵盤輸入20個整數,分別存放在兩個磁盤文件中 @blog: https://blog.csdn.net/weixin_43470383/article/details/111665194 ************************************************************************* */ #include<iostream> #include<fstream> using namespace std;int main() {int a[10];fstream outfile1, outfile2; // 定義兩個文件流對象outfile1.open("f1.dat", ios::out); // f1.dat 和 f2.dat 均為輸出文件outfile2.open("f2.dat", ios::out);if (!outfile1){cerr << "f1.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){cin >> a[i]; // 輸入10個數存放到 f1.dat 文件中outfile1 << a[i] << " ";}for (int i = 0; i < 10; i++){cin >> a[i]; // 輸入10個數存放到 f2.dat 文件中outfile2 << a[i] << " ";}outfile1.close(); // 關閉 f1.dat 文件outfile2.close(); // 關閉 f2.dat 文件system("pause");return 0; }運行結果1
輸入:
1 3 5 7 9 2 4 6 8 10 11 13 15 17 19 12 14 16 18 20
文件 f1.dat 內容:
1 3 5 7 9 2 4 6 8 10
文件 f2.dat 內容:
11 13 15 17 19 12 14 16 18 20
程序2
/* ************************************************************************* @file: main.cpp @date: 2020.12.26 @author: Xiaoxiao @brief: 從 f1.dat 中讀入10個數,然后存放到 f2.dat 文件原有數據的后面 @blog: https://blog.csdn.net/weixin_43470383/article/details/111665194 ************************************************************************* */ #include<iostream> #include<fstream> using namespace std;int main() {int a[10];fstream infile1, outfile2; // 定義兩個文件流對象infile1.open("f1.dat", ios::in); // f1.dat 作為輸入文件outfile2.open("f2.dat", ios::app); // f2.dat 作為輸出文件,寫入數據添加在文件末尾if (!infile1){cerr << "f1.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){infile1 >> a[i]; // 從 f1.dat 中讀入10個數outfile2 << a[i] << " "; // 存放到 f2.dat 文件原有數據的后面}infile1.close(); // 關閉 f1.dat 文件outfile2.close(); // 關閉 f2.dat 文件system("pause");return 0; }運行結果2
文件 f1.dat 內容:
1 3 5 7 9 2 4 6 8 10
文件 f2.dat 內容:
11 13 15 17 19 12 14 16 18 20 1 3 5 7 9 2 4 6 8 10
程序3
/* ************************************************************************* @file: main.cpp @date: 2020.12.26 @author: Xiaoxiao @brief: 從 f2.dat 中讀入20個整數并從小到大的順序(不保留原來的數據) @blog: https://blog.csdn.net/weixin_43470383/article/details/111665194 ************************************************************************* */ #include<iostream> #include<fstream> using namespace std;// 選擇法排序,不懂的可以看我的博客 // https://editor.csdn.net/md/?articleId=109249369 int sort(int a[]) {int i, j, k, min;for (i = 0; i < 19; i++){k = i;for (j = i + 1; j < 20; j++){if (a[j] < a[k])k = j;}if (k != i){min = a[k];a[k] = a[i];a[i] = min;}}return a[10]; }int main() {int i, j, k, min;int a[20];fstream infile2, outfile2; // 定義文件流對象infile2.open("f2.dat", ios::in); // f2.dat 作為輸入文件if (!infile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}for (int i = 0; i < 20; i++){infile2 >> a[i]; // 從 f2.dat 中讀入20個數}sort(a);infile2.close(); // 關閉f2.dat文件outfile2.open("f2.dat", ios::out); // f2.dat 作為輸出文件,文件中原有內容刪除if (!outfile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}for (i = 0; i<20; i++){outfile2 << a[i] << " "; // 向 f2.dat 輸出已排序的20個數cout << a[i] << " "; // 同時輸出到屏幕} infile2.close(); // 關閉f2.dat文件system("pause");return 0; }運行結果3
文件 f2.dat 內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
程序整合(函數封裝)
/* ************************************************************************* @file: main.cpp @date: 2020.12.26 @author: Xiaoxiao @brief: 從 f2.dat 中讀入20個整數并從小到大的順序(不保留原來的數據) @blog: https://blog.csdn.net/weixin_43470383/article/details/111665194 ************************************************************************* */ #include<iostream> #include<fstream> using namespace std;// 選擇法排序,不懂的可以看我的博客 // https://editor.csdn.net/md/?articleId=109249369 int sort(int a[]) {int i, j, k, min;for (i = 0; i < 19; i++){k = i;for (j = i + 1; j < 20; j++){if (a[j] < a[k])k = j;}if (k != i){min = a[k];a[k] = a[i];a[i] = min;}}return a[10]; }void fun1() {int a[10];fstream outfile1, outfile2; // 定義兩個文件流對象outfile1.open("f1.dat", ios::out); // f1.dat 和 f2.dat 均為輸出文件outfile2.open("f2.dat", ios::out);if (!outfile1){cerr << "f1.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){cin >> a[i]; // 輸入10個數存放到 f1.dat 文件中outfile1 << a[i] << " ";}for (int i = 0; i < 10; i++){cin >> a[i]; // 輸入10個數存放到 f2.dat 文件中outfile2 << a[i] << " ";}outfile1.close(); // 關閉 f1.dat 文件outfile2.close(); // 關閉 f2.dat 文件 }void fun2() {int a[10];fstream infile1, outfile2; // 定義兩個文件流對象infile1.open("f1.dat", ios::in); // f1.dat 作為輸入文件outfile2.open("f2.dat", ios::app); // f2.dat 作為輸出文件,寫入數據添加在文件末尾if (!infile1){cerr << "f1.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){infile1 >> a[i]; // 從 f1.dat 中讀入10個數outfile2 << a[i] << " "; // 存放到 f2.dat 文件原有數據的后面}infile1.close(); // 關閉 f1.dat 文件outfile2.close(); // 關閉 f2.dat 文件 }void fun3() {int i, j, k, min;int a[20];fstream infile2, outfile2; // 定義文件流對象infile2.open("f2.dat", ios::in); // f2.dat 作為輸入文件if (!infile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}for (int i = 0; i < 20; i++){infile2 >> a[i]; // 從 f2.dat 中讀入20個數}sort(a);infile2.close(); // 關閉f2.dat文件outfile2.open("f2.dat", ios::out); // f2.dat 作為輸出文件,文件中原有內容刪除if (!outfile2){cerr << "f2.dat open error!" << endl; // 檢查打開 f1.dat 是否成功exit(1);}for (i = 0; i < 20; i++){outfile2 << a[i] << " "; // 向 f2.dat 輸出已排序的20個數cout << a[i] << " "; // 同時輸出到屏幕}infile2.close(); // 關閉f2.dat文件 }int main() {fun1();fun2();fun3();system("pause");return 0; }結果和運行結果3的是一樣的。
總結
以上是生活随笔為你收集整理的【C++之文件与文件流】f1.dat 和 f2.dat 文件的读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机学习笔记 —— 串口通信原理
- 下一篇: c++ log 打印android_如何