輸入輸出流
- 1. 輸入輸出
- 2. 輸入輸出流
- 2.1 流
- 2.2 C++標準IO流
- 2.3 C++檔案IO流
- 3. stringstream
1. 輸入輸出
- 程式的輸入:從輸入檔案將資料傳送給程式;
- 程式的輸出:從程式將資料傳送給輸出檔案;
C++輸入輸出包括:
- 對系統指定標準設備的輸入輸出,即從鍵盤輸入資料,輸出到顯示幕螢屏;
- 以外存(磁盤、光碟)為物件進行輸入輸出,例如:從磁盤檔案輸入資料,資料輸出到磁盤檔案;
- 對記憶體中指定的空間進行輸入和輸出,
2. 輸入輸出流
2.1 流
- 輸入和輸出時資料傳送的程序稱為流,
- 流表示了資訊從源到目的端的流動;
- 特性:有序連續,具有方向性;
- 實際上,在記憶體中為每個資料流開辟一個記憶體緩沖區,用來存放流中的資料,即緩沖區中的資料就是流,
- C++中,輸入輸出流被定義為類;I/O庫中的類稱為流類;用流類定義的物件稱為流物件,
| 類名 | 作用 | 頭檔案宣告 |
|---|---|---|
| ios | 抽象基類 | iostream |
| istream | 通用輸入流和其他輸入流的基類 | iostream |
| ostream | 通用輸出流和其他輸出流的基類 | iostream |
| iostream | 通用輸入輸出流和其他輸入輸出流的基類 | iostream |
| ifstream | 輸入檔案流類 | fstream |
| ofstream | 輸出檔案流類 | fstream |
| fstream | 輸入輸出檔案流類 | fstream |
| istrstream | 輸入字串流類 | strstream |
| ostrstream | 輸出字串流類 | strstream |
| strstream | 輸入輸出字串流類 | strstream |
2.2 C++標準IO流
| 物件 | 含義 | 對應設備 | C語言中相應的標準檔案 | 有無緩沖區 |
|---|---|---|---|---|
| cin | 標準輸入流 | 鍵盤 | stdin | 有緩沖區 |
| cout | 標準輸出流 | 螢屏 | stdout | 有緩沖區 |
| cerr | 標準錯誤流 | 螢屏 | stderr | 無緩沖區 |
| clog | 標準錯誤流 | 螢屏 | stderr | 有緩沖區 |
- cin為緩沖流,鍵盤輸入的資料保存在緩沖區,當要提取時,從緩沖區提取;敲回車鍵完成輸入;
//敲回車鍵的有:
cin >> a;
c = getchar();
scanf("%d", &a);
gets(str);
//不需敲回車鍵:getch、getche;
- 輸入資料型別必須與要提取的資料型別一致;
- cin和cout可以直接輸入和輸出內置型別資料;
- 對于自定義型別,如果要支持cin和cout的標準輸入輸出,需要對<<和>>進行多載,
ostream operator<<(int);
void test()
{
//cin:istream物件
int a;
cin >> a;
//cin.operator>>(a);
float f;
cin >> f;
//cin.operator>>(f);
char arr[10];
cin >> arr;
//cout:ostream物件
cout << a << endl;
cout.operator<<(a).operator<<(endl);
cout << f << endl;
cout << arr << endl;
//sacnf,printf:庫函式
//cerr、clog
cerr << f << endl;
clog << arr << endl;
}
2.3 C++檔案IO流
- C++檔案內容的資料格式分為二進制檔案個文本檔案;
采用檔案流物件操作檔案的一般步驟為:
- 定義一個檔案流物件;
- 使用檔案流物件的成員函式打開一個磁盤檔案,使得檔案流物件和檔案之間建立聯系;
- 使用提取和插入運算子對檔案進行讀寫操作,或使用成員函式進行讀寫;
- 關閉檔案,
struct Student
{
char name[10];
int age;
};
void test()
{
//ofstream:輸出檔案流
//ifstream:輸入檔案流
//寫檔案:檔案不存在,創建檔案
ofstream fout("test.txt");
//fout.open("test.txt");
if (!fout.is_open())
cout << "file not open" << endl;
//寫內容
//1.文本形式:字符流讀寫
fout << "test.txt" << endl;
fout.put(' ');
fout.put('a');
fout.close();
//讀檔案:檔案不存在,打開失敗
ifstream fin("test.txt");
char arr[100];
//fin >> arr;
char ch;
ch = fin.get();
fin.get(ch);
//fin.get(arr, 100);
fin.getline(arr, 10);
ofstream fout1("test.txt");
Student stu;
stu.age = 30;
strcpy(stu.name, "abc");
fout1 << stu.name << endl;
fout1 << stu.age << endl;
fout1.close();
//二進制讀寫 :位元組流讀寫
ofstream fout2("test.binary.txt");
fout2.write((char*)&stu, sizeof(stu));
fout2.close();
ifstream fin1("test.binary.txt");
Student stu1;
/*fin >> stu.name;
fin >> stu.age;*/
fin.read((char*)&stu1, sizeof(stu1));
}
3. stringstream
- C語言中,將整型變數的資料轉化為字串格式:(1)使用itoa()函式、使用sprintf()函式,
- stringstream實際時在其底層維護了一個string型別的物件來保存結果;
- 多次資料型別轉化時,一定要用clear()來清空,才能正確轉化,但clear()不會將stringstream底層的string物件清空;
- 可以使用s. str("")方法將底層string物件設定為""空字串;
- 可以使用s.str()將讓stringstream回傳其底層的string物件;
- stringstream使用string類物件代替字符陣列,可以避免緩沖區溢位的危險,而且其會對引數型別進行推演,不需要格式化控制,也不會出現格式化失敗的風險,因此使用更方便,更安全,
void test()
{
int a = 10;
int b = 010; //8
int c = 0x10; //16
char arr[100];
itoa(a, arr, 10);
itoa(b, arr, 8);
itoa(c, arr, 16);
sprintf(arr, "%d", a);
float f = 2.3;
sprintf(arr, "%f", f);
printf("%d\n", a);
stringstream ss;
string str;
ss << a;
ss >> str;
ss.clear();//下一次轉換之前,呼叫clear介面清空狀態位,不會清空stringstream物件中的內容
ss << f;
ss >> str;
//str(重置內容):重置stringstream物件中的內容
ss.str("");
//str():獲取stringstream物件中的內容
str = ss.str();
ss.clear();
ss << f;
str = ss.str();
//字串拼接
ss.str("");
ss << "123" << "345" << "789";
cout << ss.str() << endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278806.html
標籤:其他
上一篇:啊,這該死的天氣和路況,讓我特靠譜愛車失靈了《打工人的那些事》
下一篇:告別DNS劫持,一文讀懂DoH
