ofstream和ifstream详细用法
ASCII和二進制文件的輸入輸出
First:包含頭文件#include <fstream>
ASCII輸入:
首先要創建一個in-stream對象:ifstream fin("input.txt");
逐詞讀取:fin>>num>>s;
讀取過程中遇到空白符,>>操作符就會停止讀取內容,知道遇到另一個>>操作符。
逐行讀取:fin.getline(sentence, num);
第一個參數用來接受char數組;第二個參數是在遇到換行符之前,數組允許接受的最大元素數量。
ASCII輸出:
首先聲明一個ofstream-fout類對象(打開文件):ofstream fout("output.txt");
操作舉例:
int num = 150;
char name[] = "John Doe";
fout << "Here is a number: " << num << "/n";
fout << "Now here is a string: " << name << "/n";
關閉文件(自動保存文件),或者回寫文件緩沖(保持文件打開的情況下保存文件):
fout << flush; fout.close();
二進制輸入輸出:
聲明:不再使用插入(<<)和提取(>>)操作符,必須使用read()和方法write()讀取和寫入二進制文件。
First:以二進制方式打開文件——ofstream fout("file.dat", ios::binary);
寫入:write()——共兩個參數,第一個是指向對象的char類型的指針, 第二個是對象的大小(譯者注:字節數)。
操作舉例:
int number = 30; fout.write((char *)(&number), sizeof(number));
第一個參數寫作"(char *)(&number)",這是把一個整型變量轉為char *指針。第二個參數寫作"sizeof(number)",sizeof() 返回對象大小的字節數。
優勢:復雜結構體的寫入——如果使用ASCII方式寫入,只能一條一條的寫入所有的成員變量。
操作舉例:
struct OBJECT { int number; char letter; } obj;
obj.number = 15;
obj.letter = ‘M’;
fout.write((char *)(&obj), sizeof(obj));
讀取:read()——同write()
ifstream fin("file.dat", ios::binary);
fin.read((char *)(&obj), sizeof(obj));
算法描述:
1 #include <iostream>
2 #include <fstream>
3 #include <string>
4
5 using namespace std;
6
7 //輸出空行
8 void OutPutAnEmptyLine()
9 {
10 cout<<"
";
11 }
12
13 //讀取方式: 逐詞讀取, 詞之間用空格區分
14 //read data from the file, Word By Word
15 //when used in this manner, we'll get space-delimited bits of text from the file
16 //but all of the whitespace that separated words (including newlines) was lost.
17 void ReadDataFromFileWBW()
18 {
19 ifstream fin("data.txt");
20 string s;
21 while( fin >> s )
22 {
23 cout << "Read from file: " << s << endl;
24 }
25 }
26
27 //讀取方式: 逐行讀取, 將行讀入字符數組, 行之間用回車換行區分
28 //If we were interested in preserving whitespace,
29 //we could read the file in Line-By-Line using the I/O getline_r() function.
30 void ReadDataFromFileLBLIntoCharArray()
31 {
32 ifstream fin("data.txt");
33 const int LINE_LENGTH = 100;
34 char str[LINE_LENGTH];
35 while( fin. getline_r(str,LINE_LENGTH) )
36 {
37 cout << "Read from file: " << str << endl;
38 }
39 }
40
41 //讀取方式: 逐行讀取, 將行讀入字符串, 行之間用回車換行區分
42 //If you want to avoid reading into character arrays,
43 //you can use the C++ string getline_r() function to read lines into strings
44 void ReadDataFromFileLBLIntoString()
45 {
46 ifstream fin("data.txt");
47 string s;
48 while( getline_r(fin,s) )
49 {
50 cout << "Read from file: " << s << endl;
51 }
52 }
53
54 //帶錯誤檢測的讀取方式
55 //Simply evaluating an I/O object in a boolean context will return false
56 //if any errors have occurred
57 void ReadDataWithErrChecking()
58 {
59 string filename = "dataFUNNY.txt";
60 ifstream fin( filename.c_str());
61 if( !fin )
62 {
63 cout << "Error opening " << filename << " for input" << endl;
64 exit(-1);
65 }
66 }
67
68 int main()
69 {
70 ReadDataFromFileWBW(); //逐詞讀入字符串
71 OutPutAnEmptyLine(); //輸出空行
72
73 ReadDataFromFileLBLIntoCharArray(); //逐詞讀入字符數組
74 OutPutAnEmptyLine(); //輸出空行
75
76 ReadDataFromFileLBLIntoString(); //逐詞讀入字符串
77 OutPutAnEmptyLine(); //輸出空行
78
79 ReadDataWithErrChecking(); //帶檢測的讀取
80 return 0;
81 }
ASCII讀取方式
ifstream 和ofstream對象
打開文件:
ifstream fin("input.txt"); ofstream fout("output.txt");
ifstream fin("file.dat", ios::binary); ofstream fout("file.dat", ios::binary);
默認打開為ASCII方式,不存在則創建,存在則覆蓋。二進制方式打開文件選項ios::binary為額外標志。
其他額外選項:
ios::app 添加到文件尾
ios::ate 把文件標志放在末尾而非起始。
ios::trunc 默認. 截斷并覆寫文件。
ios::nocreate 文件不存在也不創建。
ios::noreplace 文件存在則失敗。
檢查文件:
good():返回一個布爾值,表示文件打開是否正確。
bad():返回一個布爾值,表示文件打開是否錯誤。
fail():類似于bad()。
文件狀態:
eof() :返回是否標志已經到了文件末尾。
1 #include <stdio.h>
2 int main(void)
3 {
4 int n;
5 int array[25];
6 while (scanf("%d",&n),n!=EOF) //while(scanf("%d",&n)!=EOF)也行
7 {
8 for (int i=0; i<n; i++)
9 scanf("%d",array+i);
10 for (i=0; i<n; i++)
11 printf ("%d ",array[i]);
12 }
13 return 0;
14 }
eof()舉例
讀文件:
get():每次返回一個字符。
ignore(int,char):跳過輸入流中n個字符,或在遇到指定的終止字符時提前結束(此時跳過包括終止字符在內的若干字符)。
原型:istream &ignore( streamsize num=1, int delim=EOF )
功能:用于輸入流。它讀入字符,直到已經讀了num 個字符(默認為1)或是直到字符delim 被讀入(默認為EOF)
調用方式:cin.ignore(n,終止字符)
1 #include<iostream>
2 usingnamespacestd;
3 intmain()
4 {
5 chararray[8];
6 cin.ignore(6,'a');
7 cin.getline(array,8);
8 cout<<array<<endl;
9 return0;
10 }
ignore()舉例
peek():
調用方式:cin.peek()
說明:其返回值是一個char型的字符,其返回值是指針指向的當前字符,但它只是觀測,指針仍停留在當前位置,并不后移。如果要訪問的字符是文件結束符,則函數值是EOF(-1)。
功能:從輸入流中讀取一個字符 但該字符并未從輸入流中刪除。即若把輸入流比作一個 棧類,那么這里的peek函數就相當于棧的成員函數front ,而cin.get()則相當于棧的成員函數pop。
1 / istream peek
2 #include <iostream>
3 using namespace std;
4 int main () {
5 char c;
6 int n;
7 char str[256];
8 cout << "Enter a number or a word: ";
9 c=cin.peek();
10 if ( (c >= '0') && (c <= '9') )
11 {
12 cin >> n;
13 cout << "You have entered number " << n << endl;
14 }
15 else
16 {
17 cin >> str;
18 cout << " You have entered word " << str << endl;
19 }
20 return 0;
21 }
peek()舉例
putback(char):
調用方式:cin.putback(ch)
功能:將前面用get或者getline函數從輸入流中讀取的字符ch返回到輸入流,插入到當前指針的位置,供后面讀取。
1 using namespace std;
2 int main () {
3 char c;
4 int n;
5 char str[256];
6 cout << "Enter a number or a word: ";
7 c = cin.get();
8 if ( (c >= '0') && (c <= '9') )
9 {
10 cin.putback (c);
11 cin >> n;
12 cout << "You have entered number " << n << endl;
13 }
14 else
15 {
16 cin.putback (c);
17 cin >> str;
18 cout << " You have entered word " << str << endl;
19 }
20 return 0;
21 }
putback()舉例
寫文件:
put():向流寫入一個字符。
其原型:ofstream &put(char ch)
操作舉例:file1.put('c');就是向流寫一個字符'c'。
putchar():
調用方式:putchar(c)——加上頭文件#include <stdio.h>或#include "stdio.h"。
說明:當c為一個被單引號(英文狀態下)引起來的字符時,輸出該字符(注:該字符也可為轉義字符);
當c為一個介于0~127(包括0及127)之間的十進制整型數時,它會被視為對應字符的ASCII代碼,輸出該ASCII代碼對應的字符;
當c為一個事先用char定義好的字符型變量時,輸出該變量所指向的字符。
返回值:正確即為字符;錯誤即EOF文件結束符。
功能:向終端輸出一個字符。
文件定位:
seekg():對讀定位,設置輸入文件流的指針位置。有兩個參數,第一個是偏移量(正表示向后偏移,負表示向前偏移),第二個是基地址。
seekp():對寫定位,設置輸出文件流的指針位置。
函數原型:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dirdir );
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
分析:
函數參數
pos:新的文件流指針位置值
off:需要偏移的值
dir:搜索的起始位置
dir參數用于對文件流指針的定位操作上,代表搜索的起始位置
在ios中定義的枚舉類型:
enum seek_dir {beg, cur, end};
每個枚舉常量的含義:
ios::beg:文件流的起始位置
ios::cur:文件流的當前位置
ios::end:文件流的結束位置
注:這兩個函數一般用于二進制文件,因為文本文件會因為系統對字符的解釋而可能與預想的值不同。
tellg()函數不需要帶參數,它返回當前定位指針的位置,也代表著輸入流的大小。
而tellp()函數用于寫文件時。
總結
以上是生活随笔為你收集整理的ofstream和ifstream详细用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS中this的应用场景,再了解下app
- 下一篇: 如何在拼多多查看好友列表