文章目錄
- 一:C語言的輸入和輸出及C++ IO流
- (1)什么是流
- (2)C++ I/O流
- A:C++標準IO流
- B:C++檔案IO流
- 二:stringstream
- (1)基本介紹
- (2)參考
- A:資料型別轉換
- B:字串的拼接
一:C語言的輸入和輸出及C++ IO流
在C語言中,我們經常用到的輸入和輸出的函式共有三組
| 輸入/輸出 | 操作物件 |
|---|---|
| printf/scanf | 控制臺 |
| fprintf/fscanf | 檔案 |
| sprintf/sscanf | 字符陣列(緩沖區) |
而C++中對應的操作如下
| 輸入/輸出 | 操作物件 |
|---|---|
| ostream/isream | 控制臺 |
| ofstream/istream | 檔案 |
| ostringstream/istringstream | 字符陣列(緩沖區) |
(1)什么是流
流即流動的意思,是物質從一處向另一處流動的程序,是對一種有序連續且具有方向性的資料的抽象描述 C++流是指資訊從外部輸入設備(比如鍵盤)向計算機內部(記憶體)輸入和從記憶體向外部輸出設備(比如螢屏)的程序
為了實作這種流動,C++定義了I/O標準類別庫,每個類稱為一個流,以完成某些功能,
(2)C++ I/O流
C++實作了一個龐大的類別庫,其中IOS為基類,其他類都是直接或間接派生自IOS類
我們進城使用的cin和cout就是該類的一個物件

A:C++標準IO流
**C++標準庫提供了4個全域流物件:cin,cout,cerr,cblog,分別對應標準輸入,標準輸出,標準錯誤和標準日志 **
對于cin要特別注意以下幾點
- 空格和回車都可以作為資料之間的分隔符,所以多個資料可以在一行輸入,也可以分行輸入,但是如果是字符型和字串,則空格無法用
cin輸入,字串中不能有空格,但是可以使用getline(cin,"this is a test") - 在做演算法題時,如果使用ACM模式,經常會讓你自己寫出輸入的函式,所以`
//單個元素輸入
while(cin>>a)
{
//代碼片段
}
//多個元素回圈輸入
while(cin>>a>>b>>c)
{
//代碼片段
}
//整行接受
while(cin>>str)
{
//代碼片段
}
B:C++檔案IO流
C/C++根據檔案內容的資料格式分為二進制檔案和文本檔案

在C語言中讀寫檔案其實是一個相對比較繁瑣的操作,因為有很多引數需要記憶,而且還要打開檔案關閉檔案,但是在C++中,我們使用的仍然是面向物件的思想,
我們主要會使用到兩種檔案流:
ifstream ifile(只做輸入)ofstream ofile(只做輸出)
實體化后物件之后,檔案操作就變成了呼叫這些物件的介面的操作了,
如下,我們用一個服務器的ip及埠號資訊進行演示,它封裝在一個結構體SeverInfo中
struct ServerInfo
{
char _ip[32];//Ip地址
int _port;//埠號
};
我們創建一個類ConfigManager,這個類所做的作業就是將資料寫入到檔案,或者檔案讀取記憶體等操作
首先是類的成員,類里面的成員就定義一個string,這個string存放的是到時候要將資料寫入到磁盤上的檔案名,這里我定義為myconfig.txt
class ConfigManager
{
public:
ConfigManager(const char* configfile = "myconfig.txt")//構造
:_configfile(configfile)
{}
private:
string _configfile;//組態檔名字
};
首先進行的是打開檔案以二進制的方式寫入結構體的內容,需要使用到的流是ofstream,其建構式是
explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);
- 其中第一個引數就是組態檔名,第二個引數需要制定使用二進制的方式打開寫入
ofstream物件的write方法的引數為
ostream& write (const char* s, streamsize n);
- 第一個引數是其實地址,由于是二進制的方式寫,所以我們將其強轉為
char*
接著是使用二進制的方式打開讀入,需要使用的流是ifstream和read方法
所以二進制的讀寫如下
void WriteBin(const ServerInfo& info)
{
ofstream ofs(_configfile);//二進制寫入物件
ofs.write((const char*)& info, sizeof(ServerInfo));//寫入
}
void ReadBin(const ServerInfo& info)
{
ifstream ifs(_configfile);//二級制從某檔案讀取
ifs.read((char*)& info, sizeof(ServerInfo));//讀入
}
int main()
{
ConfigManager conf;
ServerInfo W_info;
ServerInfo R_info;
strcpy(W_info._ip, "198.168.0.1");
W_info._port = 22;
conf.WriteBin(W_info);//二進制寫入到磁盤
conf.ReadBin(R_info);//然后讀取的R_info中
cout << R_info._ip << endl;
cout << R_info._port << endl;
}

然后,對于文本讀寫在C++則是非常簡單,因為ofstream和ifstream都分別多載了<<和>>運算子
void WriteText(const ServerInfo& info)//文本方式寫入
{
ofstream ofs(_configfile);
ofs << info._ip << endl;
ofs << info._port << endl;//注意加入換行符,不然分不清楚
}
void ReadText(ServerInfo& info)
{
ifstream ifs(_configfile);
ifs >> info._ip;
ifs >> info._port;
}
int main()
{
ConfigManager conf;
ServerInfo W_info;
ServerInfo R_info;
strcpy(W_info._ip, "198.168.0.1");
W_info._port = 22;
conf.WriteText(W_info);
conf.ReadText(R_info);
cout << R_info._ip << endl;
cout << R_info._port << endl;
}

二:stringstream
(1)基本介紹
定義了三個類,分別為istringstream,ostringstream和stringstream,其中最為重要的就是stringstream
(2)參考
A:資料型別轉換
#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
stringstream sstream;
string strResult;
int nValue = 1000;
// 將int型別的值放入輸入流中
sstream << nValue;
// 從sstream中抽取前面插入的int型別的值,賦給string型別
sstream >> strResult;
cout << "[cout]strResult is: " << strResult << endl;
printf("[printf]strResult is: %s\n", strResult.c_str());
return 0;
}

.str()方法是將stringstream型別轉換為string
B:字串的拼接
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream sstream;
// 將多個字串放入 sstream 中
sstream << "first" << " " << "string,";
sstream << " second string";
cout << "strResult is: " << sstream.str() << endl;
// 清空 sstream
sstream.str("");
sstream << "third string";
cout << "After clear, strResult is: " << sstream.str() << endl;
return 0;
}

- 如上,可以將多個字串放入stringstream中,以達到拼接的目的
str("")和clear()的區別:clear()不會清空內容,他只是把最初對字串轉換型別等操作清除而已,相當于“初始化”,如果轉換成int,那么就不能把向原字串添加內容了,這時候可以使用clear(),str()只是把內容變成“”,而且也沒有辦法向里面添加內容了,后面跟一個clear()的話就可以添加內容了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280357.html
標籤:其他
上一篇:計算機原理 二
下一篇:阿里巴巴實習面試經歷
