深圳學(xué)校網(wǎng)站建設(shè)報價北京疫情最新新聞
文章目錄
- 一、類型轉(zhuǎn)換
- C語言
- 隱式類型轉(zhuǎn)換
- 強(qiáng)制類型轉(zhuǎn)換
- C++
- 類型轉(zhuǎn)換的情況
- 類型轉(zhuǎn)換的函數(shù)(4個)
- 二、IO流
- 1、緩沖區(qū)
- 2、提高輸入輸出效率
- 3、文件操作
- 文件權(quán)限
- 寫操作 --- ofstream
- 文本方式寫入
- 二進(jìn)制方式寫入
- 讀操作 --- ifstream
- 文本方式讀取
- 二進(jìn)制方式讀取
- 其他操作
- 判斷文件是否成功打開?
一、類型轉(zhuǎn)換
當(dāng)兩個類型不是嚴(yán)格的相同的時候,就會有類型轉(zhuǎn)換的問題。
C語言
隱式類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。
隱式類型轉(zhuǎn)換
適用于類型相似的內(nèi)置類型(整型、浮點(diǎn)數(shù)、字符型)之間進(jìn)行類型轉(zhuǎn)化。比如:整型和字符型之間,整型和浮點(diǎn)數(shù)之間。
int a = 10;
double b = a; // 整型和浮點(diǎn)數(shù)之間
char c = a; // 整型和字符型之間
強(qiáng)制類型轉(zhuǎn)換
適用于整型和指針之間,指針和指針之間。
int a = 10;
int* pa = &a;
int b = (int)pa; // 整型和指針之間
double* pb = (double*)b; // 指針和指針之間
C++
類型轉(zhuǎn)換的情況
C++不僅僅兼容C的類型轉(zhuǎn)換,還有一些自定義類型之間的轉(zhuǎn)換。
內(nèi)置類型 -> 自定義類型
自定義類型 -> 內(nèi)置類型
自定義類型 -> 自定義類型
// 內(nèi)置類型轉(zhuǎn)換成自定義類型
// 通過構(gòu)造函數(shù)實(shí)現(xiàn)的
class A
{
private:int _a;int _b;
public:A(int a, int b):_a(a), _b(b){}
};
A a(1, 3);// 自定義類型轉(zhuǎn)換成內(nèi)置類型
// 通過get函數(shù),將A類型轉(zhuǎn)換成int
class A
{
private:int _a;int _b;
public:friend int get(A& a);A(int a, int b):_a(a), _b(b){}
};
int get(A& a)
{return a._a;
}// 自定義類型轉(zhuǎn)換成自定義類型
// 將子類賦值給父類,也可以通過構(gòu)造函數(shù)實(shí)現(xiàn),方法不唯一
class A
{
private:int _a;int _b;
public:A(int a = 1, int b = 1):_a(a), _b(b){}
};
class B:public A
{
private:int _c;
public:B(int c = 1):_c(c){}
};
B b;
A a = b;
類型轉(zhuǎn)換的函數(shù)(4個)
// 隱式類型轉(zhuǎn)換:static_cast<T>
int a = 10;
double b = 3.4;
a = static_cast<int>(b);
// 強(qiáng)制類型轉(zhuǎn)換:reinterpret<T>
int a = 10;
int* pa = &a;
int b = reinterpret_cast<int>(pa);
// const類型轉(zhuǎn)換:const_cast<T> --- 用于刪除變量的const屬性
const int x = 10;
int* px = const_cast<int*>(&x);
*px = 4;
std::cout << *px << std::endl;
// 向下轉(zhuǎn)換:dynamic_cast<T>(父類對象指針/引用 -> 子類指針/引用)
class A
{
public:virtual void print(){std::cout << "A: print()" << std::endl;}
};
class B : public A
{
public:virtual void print(){std::cout << "B: print()" << std::endl;}
};
A* a = new B;
B* b = dynamic_cast<B*>(a);
b->print();
二、IO流
1、緩沖區(qū)
輸入輸出是有緩沖區(qū)的概念的,根據(jù)Linux中學(xué)的一切皆文件,大概的也能明白(因?yàn)槲募锩嬗芯彌_區(qū))。
// 根據(jù)下面的代碼可以深刻的體會出緩沖區(qū)的概念。
// 一次性輸入10x
// 下面會直接輸出:
// 10
// x
// 我們只輸入的了一次,為什么會直接都輸出出來呢?
// 答:當(dāng)我們輸入10x的時候,第一次因?yàn)樽兞縜是int類型,他只讀到了10,然后就直接退出了,而x還在緩沖區(qū)中。當(dāng)緩沖區(qū)不空的時候,我們是沒有辦法繼續(xù)往里面進(jìn)行讀數(shù)據(jù)的,需要將其進(jìn)行接收。然后ch正好是字符類型,接收了x,所以最后會直接打印出來,而不需要我們輸入兩次。// 所以為了解決某種用戶輸入不正確的數(shù)據(jù)時,需要我們進(jìn)行判斷,然后對緩沖區(qū)進(jìn)行清空,以便不影響下一次輸入。
#include <iostream>
int main()
{int a = 0;std::cin >> a;std::cout << a << std::endl;char ch = 0;std::cin >> ch;std::cout << ch << std::endl;return 0;
}
2、提高輸入輸出效率
// 第一種方式:--- 用C語言的輸入輸出
//printf
//scanf// 第二種方式 --- C++
// 在main函數(shù)中加入這三句語句,一個main函數(shù)只需要寫一次
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
3、文件操作
進(jìn)行文件操作的時候只需要包含fstream即可。
下面是文件頭文件的結(jié)構(gòu)圖。
文件權(quán)限
ios::in
:以輸入(讀取)模式打開文件。ios::out
:以輸出(寫入)模式打開文件。ios::app
:以追加模式打開文件,寫入的數(shù)據(jù)會追加到文件末尾。ios::ate
:打開文件時,立即將文件指針移動到文件末尾。ios::trunc
:如果文件已存在,打開時清空文件內(nèi)容。ios::binary
:以二進(jìn)制模式打開文件,而不是默認(rèn)的文本模式。
寫操作 — ofstream
文本方式寫入
#include <iostream>
#include <fstream>int main()
{// 以文本方式打開文件(如果默認(rèn)路徑下沒有文件,則新建文件)、// 默認(rèn)的權(quán)限是ios::out// std::ofstream fout("test.txt", std::ios::out); --- 以寫的方式打開文件// std::ofstream fout("test.txt", std::ios::out | std::ios::app); --- 以追加模式的寫的方式打開文件// ...std::ofstream fout("test.txt");// 文本輸入fout << "12434\n";fout << "abcdefg";fout << "hijk";// 關(guān)閉文件fout.close(); return 0;
}
二進(jìn)制方式寫入
#include <iostream>
#include <string>
#include <fstream>
#include <vector>int main()
{std::vector<int> v = { 1, 2, 3, 4 };// 打開文件,以寫的方式std::ofstream fout("test.txt", std::ios::out | std::ios::binary);// 寫入文件// ostream& write (const char* s, streamsize n);for (auto& e : v){fout.write(reinterpret_cast<char*>(&e), sizeof(e));}// 關(guān)閉文件fout.close();return 0;
}
讀操作 — ifstream
文本方式讀取
#include <iostream>
#include <string>
#include <fstream>int main()
{// 打開文件,以讀的方式std::ifstream fin("test.txt");// 讀取文件std::string tmp;while (fin >> tmp){std::cout << tmp << std::endl;}// 關(guān)閉文件fin.close();return 0;
}
二進(jìn)制方式讀取
// 以什么方式寫,就以什么方式讀
// 也要注意數(shù)據(jù)的格式,如果是整型就整形方式讀,自定義類型就自定義類型方式讀
#include <iostream>
#include <string>
#include <fstream>
#include <vector>int main()
{// 打開文件,以讀的方式std::ifstream fin("test.txt", std::ios::in | std::ios::binary);// 讀取文件char ch;while (fin.read(&ch, sizeof(ch))){std::cout << ch;}if (fin.good()){std::cout << "讀取成功" << std::endl;}// 關(guān)閉文件fin.close();return 0;
}
其他操作
判斷文件是否成功打開?
#include <iostream>
#include <string>
#include <fstream>
#include <vector>int main()
{// 打開文件,以讀的方式std::ifstream fin("test.txt", std::ios::in | std::ios::binary);// 判斷是否成功打開文件if (!fin){std::cout << "無法打開文件!" << std::endl;return 1;}// 關(guān)閉文件fin.close();return 0;
}
謝謝大家!