【C++】<知識點> 標準和文件的輸入輸出

目錄

????????一、輸入輸出操作

????????????????1. 相關的類

????????????????2. 標準流對象

????????????????3. istream類的成員函數

二、流操縱算子

????????1. 整數流的基數

????????2. 浮點數精度的流操縱算子

????????3. 域寬的流操縱算子

????????4. 其他的流操縱算子

????????5. 用戶自定義流操縱算子

三、文件讀寫

????????1. 文本文件的讀寫

????????2. 二進制文件的讀寫

????????3. 文件讀寫指針

????????4. 文本文件和二進制文件區別


一、輸入輸出操作

1. 相關的類

  • ios基類派生出istream和ostream。
  • istream派生出ifstream,ostream派生出ofstream。
  • iostream繼承自istream和ostream。
  • fstream繼承自iostream。

注意:cin就是istream類的對象,cout就是istream類的對象。

2. 標準流對象

(1) 輸入流對象:cin與標準輸入設備相連(從鍵盤獲取數據)。也可以被重定向為從文件中讀取數據。

(2) 輸出流對象:

  • cout與標準輸出設備相連(在屏幕上打印數據)。也可以被重定向為向文件寫入數據(freopen函數)。
  • cerr與標準錯誤輸出設備相連。
  • clog與標準錯誤輸出設備相連。
  • cerr和clog的區別在于cerr不使用緩沖區,直接向顯示器輸出信息;而clog采用緩沖區,只有緩沖區滿或者刷新時才會輸出到屏幕上。

(3) 代碼示例:

【1】輸出重定向

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;int main()
{double x, y;cin >> x >> y;//freopen函數:輸出重定向到文件//原型:FILE *freopen(const char *path, const char *mode, FILE * stream);//path是目標文件//mode為文件打開模式"r"或"w"//stream為標準流文件,例如stdin標準輸入流, stdout標準輸出流, stderr標準錯誤流freopen("cout.txt", "w", stdout);if (y == 0) {cerr << "error!" << endl;}else {cout << x / y;//輸出到文件cout.txt中}return 0;
}

??

顯然,屏幕上并沒有輸出計算結果0.5,該結果輸出到cout.txt文件中。

【2】輸入重定向

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;int main()
{int n1 = 0, n2 = 0;//freopen函數:輸入重定向freopen("input.txt", "r", stdin);cin >> n1 >> n2;//由于重定向了,不會在終端等用戶輸入cout << "結果:" << n1 << ", " << n2 << endl;return 0;
}

【3】判斷輸入流結束

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;int main()
{int x;freopen("test.txt", "r", stdin);while (cin >> x) {cout << "讀入:" << x << endl;}return 0;
}

注意:①這里將cin重定向為從文件讀取數據,那么讀到文件末尾即結束。若未重定向,從鍵盤中輸入則需要單獨一行輸入Ctrl+Z代表輸入流結束。cin >> x返回值為istream&,而istream會有對象的重載,將其轉換成bool類型,因此可以作為循環條件。

3. istream類的成員函數

(1) getline函數:

  • 原型:①istream& getline(char* buf, int bufSize); ②istream& getline(char* buf, int bufSize, char delim);
  • 對于第一個原型:從輸入流中讀取bufSize-1個字符到緩沖區buf,或讀到'\n'為止(哪個先到算哪個)。
  • 對于第二個原型:從輸入流中讀取bufSize-1個字符到緩沖區buf,或讀到delim字符為止(哪個先到算哪個)。
  • ?注意:
    • 兩個函數都會自動在buf中讀入數據的結尾添加'\0'。
    • ‘\0’和delim都不會被讀入buf,但會被輸入流中取走。
    • 如果輸入流中'\n'或delim之前的字符個數達到或超過了bufSize個,就導致讀入錯誤,即雖然本次讀入已經完成,但是之后的讀入就都失敗了。
    • 可以用if (!cin.getline(...))判斷輸入是否結束。

(2) bool eof(); 用于判斷輸入流是否結束。

(3) int peek(); 返回下一個字符,但不從流中去除。

(4) istream& putback(char c); 將字符ch放回輸入流的頭部。

(5) istream& ignore(int nCount = 1, int delim = EOF); 從流中刪掉最多nCount個字符,遇到EOF結束。

(6) getline函數代碼示例:

#include <iostream>
using namespace std;int main()
{int x;char buf[90];cin >> x;cin.getline(buf, 90, '\n');cout << buf << endl;return 0;
}


二、流操縱算子

1. 整數流的基數

(1) 說明:在cout時,可以指定輸出的整數的進制:dec(十進制)、oct(八進制)、hex(十六進制)。

(2) 注意:①使用流操縱算子,需要添加頭文件iomanip。②一旦設置,就會持續有效直到新的操縱算子出現。

(3) 代碼示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{int n = 10;cout << dec << n << endl;//十進制顯示ncout << oct << n << endl;//八進制顯示ncout << hex << n << endl;//十六進制顯示n//一旦設置dec、oct或者hex,就會持續有效直到寫新操縱算子。cout << n << endl;return 0;
}

2. 浮點數精度的流操縱算子

(1) precision:是ostream的成員函數,調用方式為:cout.precision(5); 用于指定浮點數的有效位數(非定點方式)系統默認是非定點方式。

(2) setprecision:流操縱算子,調用方式為:cout << setprecision(5); 用于指定浮點數的有效位數(非定點方式)和指定浮點數的小數后的有效位數(非定點方式)定點方式:小數點必須出現在個位數后面。

(3) 注意:

  • 當位數超過精度時會四舍五入。
  • setprecision方式會持續有效,直到設置新的精確度。
  • setprecision操縱算子也需要添加頭文件iomanip。
  • 在非定點方式下,setprecision可能會使用科學計數法來表示。

(4) setiosflags(ios::fixed):以小數點位置固定的方式來輸出(可以簡單用cout << fixed;)。另外,cout << scientific表示采用科學計數法。

(5) resetiosflags(ios::fixed):取消以小數點位置固定的方式來輸出。

(6) 代碼示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{float f = 1234567.89;int n = 123456;//默認是非定點方式cout << "*****非定點******" << endl;cout << setprecision(6);//設置浮點數有效位數為6cout << f << endl;//由于非定點方式且規定只能有6位,因此用科學計數法顯示cout << n << endl;//浮點數的操縱算子不影響整數//修改為定點方式cout << "*****定點********" << endl;cout << setiosflags(ios::fixed);cout << f << endl;//小數點后有6位,不夠就補0//修改為非定點方式cout << "*****非定點******" << endl;cout << resetiosflags(ios::fixed);cout << f << endl;//由于非定點方式且規定只能有6位,因此用科學計數法顯示return 0;
}

3. 域寬的流操縱算子

(1) setw:流操縱算子,用于設置域寬。調用方式:cout << setw(5)或cin >>?setw(5)。

(2) width:成員函數,用于設置域寬。調用方式:cout.width(5)或cin.width(5)。

(3) 注意:域寬的流操縱算子是一次性的,每次輸入輸出前都需要指定寬度。

(4) 代碼示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{int m = 4;char string[10];cin >> setw(5);//設置輸入寬度while (cin >> string) {cout << setw(m++);//設置輸出寬度cout << string << endl;cin >> setw(5);}return 0;
}

(5) 結果解釋:

  • 第一行是我們輸入的數據1234567890.
  • 第二行輸出1234。首先,設置輸入寬度為5(實際上只接收4個字符,最后自動加'\0'),那么string里就是1234‘\0’。其次,設置輸出寬度為4(設置完后m自增為5),那么輸出4個字符即1234.
  • 第三行輸出" 5678"。首先,設置輸入寬度為5(實際上只接收4個字符,最后自動加'\0'),那么string里就是5678‘\0’。其次,設置輸出寬度為5(設置完后m自增為6),那么輸出5個字符即空格+5678.
  • 第四行輸出"? ? 90"。首先,設置輸入寬度為5(實際上只接收4個字符,最后自動加'\0'),那么string里就是90‘\0’。其次,設置輸出寬度為6(設置完后m自增為7),那么輸出6個字符即4個空格+90.

4. 其他的流操縱算子

(1) cout << showpos; 非負數顯示正號。

(2) cout << noshowpos; 非負數不顯示正號。

(3) cout << setfill(*); 寬度不足用*填補。

(4) cout << right; 右對齊,寬度不足則左邊填充。

(5) cout << left; 左對齊,寬度不足則右邊填充。

(6) cout << internal; 在負號和數字之間填充。

(7) 綜合案例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{int i = 141;double x = 1234567.89, y = 12.34567;//1) 8d 141 215cout << "1) " << hex << i << " " << dec << i << " " << oct << i << endl;//2) 1.2346e+006 12.346cout << "2) " << setprecision(5) << x << " " << y << endl;//3) 1234567.89000 12.34567cout << "3) " << fixed << setprecision(5) << x << " " << y << endl;//4) 1.23457e+006 1.23457e+001cout << "4) " << scientific << setprecision(5) << x << " " << y << endl;//5) ***+12.10000cout << "5) " << showpos << right << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;//6) 12.10000****cout << "6) " << noshowpos << left << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;//7) ****12.10000cout << "7) " << noshowpos << right << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;//8) -***12.10000cout << "8) " << showpos << right << fixed << setprecision(5) << internal << setfill('*') << setw(12) << -12.1 << endl;//9) 12.10000cout << "9) " << noshowpos << fixed << setprecision(5) << 12.1 << endl;return 0;
}

5. 用戶自定義流操縱算子

(1) 格式:

ostream& 函數名(ostream& cout) {//執行的操作return cout;
}

(2) 代碼示例:定義tab流操縱算子。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;ostream& tab(ostream& output) {return output << '\t';
}int main()
{cout << "a" << tab << "b" << endl;return 0;
}

(3) 底層解釋:由于iostream里對<<進行了重載(使用成員函數方式),即ostream& operator << (ostream& (*p) (ostream&)); 其中ostream& (*p) (ostream&)是函數指針,能夠根據函數名找到對應的函數并執行函數體,同時內部還返回了*this就是對象本身。因此,在上述示例中,tab就是一個函數名,會執行tab的函數體。


三、文件讀寫

1. 文本文件的讀寫

(1) 創建讀文件對象:ifstream srcFile("in.txt", ios::in);

(2) 創建寫文件對象:ofstream destFile("out.txt", ios::out);

(3) 從文件中讀取字符:srcFile >> x;

(4) 將字符寫入文件:destFile << x;

(5) 注意:

  • 寫文件對象中ios::out選項:刪除原有內容,寫入新內容。
  • 寫文件對象中ios::app選項:在原內容后面追加新內容。
  • 讀寫文件對象中ios::binary選項:以二進制方式寫入/讀取。
  • ifstream和ofstream換成fstream也行。

(6) 代碼示例:將in.txt中的內容1 234 9 45 6 879排序,并存到out.txt中。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{//1.打開文件in.txtifstream srcFile("./in.txt", ios::in);if (!srcFile) {cout << "srcFile文件打開失敗!" << endl;return -1;}//2.讀取文本字符并加入vector中int readInt;vector<int> v;while (srcFile >> readInt) {v.push_back(readInt);}//3.對vector中元素排序sort(v.begin(), v.end());//4.將排序結果寫入out.txtofstream outFile("./out.txt", ios::out);if (!outFile) {cout << "outFile文件打開失敗!" << endl;return -1;}for (int i = 0; i < v.size(); i++) {outFile << v[i] << " ";}//5.關閉文件srcFile.close();outFile.close();return 0;
}

? ? ? ? ?

2. 二進制文件的讀寫

(1) 創建讀寫對象:方式與文本文件相同,但是選項要或(|)上ios::binary選項!

(2) 讀文件:使用ifstream和fstream中的成員函數read函數。

  • 函數原型:istream& read(char* s, long n);
  • 功能:將文件讀指針指向的地方的n個字節內容,讀取到內存地址s,然后讀指針向后移動n字節。

(3) 寫文件:使用ofstream和fstream中的成員函數write函數。

  • 函數原型:istream& write(const char* s, long n);
  • 功能:將內存地址s處的n個字節內容,寫入到寫指針指向的位置,然后寫指針向后移動n字節。

(4) 代碼示例:將整數120寫入二進制文件,再從該二進制文件中讀取整數。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;int main()
{//寫入ret于二進制文件out.dat中int ret = 120;ofstream outFile("./out.dat", ios::out | ios::binary);outFile.write((const char*)(&ret), sizeof(int));outFile.close();//從out.dat中讀取一個整數int readInt;ifstream inFile("./out.dat", ios::in | ios::binary);inFile.read((char*)(&readInt), sizeof(int));inFile.close();//顯示讀取的整數cout << readInt << endl;return 0;
}

3. 文件讀寫指針

(1) 介紹:

  • 對于輸入文件,有一個讀指針。
  • 對于輸出文件,有一個寫指針。
  • 對于輸入輸出文件,有一個讀寫指針。
  • 讀/寫指針標識文件操作的當前位置。

(2) 讀指針相關操作:

  • tellg():獲取讀指針的位置。調用方式:"輸出對象.tellg()"。
  • seekg(int i):移動讀指針至第i個字節處。調用方式:"輸出對象.seekg(i)"。
  • seekg(int i, ios::beg):移動至距文件開始的第i個位置。
  • seekg(int i, ios::cur):移動至當前位置后的第i位置。
  • seekg(int i, ios::end):移動至距文件末尾的第i個位置。(常用于統計文本的字符數)

(3) 寫指針相關操作:

  • tellp():獲取寫指針的位置。調用方式:"輸出對象.tellp()"。
  • seekp(int i):移動寫指針至第i個字節處。調用方式:"輸出對象.seekp(i)"。
  • seekp(int i, ios::beg):移動至距文件開始的第i個位置。
  • seekp(int i, ios::cur):移動至當前位置后的第i位置。
  • seekp(int i, ios::end):移動至距文件末尾的第i個位置。

(4) 代碼示例:輸出A~Z于test.txt中,并且每兩個字符間空兩格。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;int main()
{ofstream outFile("./test.txt", ios::out);/* 輸出A~Z于test.txt中,并且每兩個字符間空兩格*/for (char i = 'A'; i <= 'Z'; i++) {//獲取寫文件指針位置int location = outFile.tellp();//寫入字符outFile << i;//文件指針會自動+1,再使用seekp跳到后兩個位置outFile.seekp(2, ios::cur);//打印測試信息cout << location << endl;}//關閉文件outFile.close();return 0;
}

4. 文本文件和二進制文件區別

(1) 不同操作系統下換行符號區別:

  • Linux下的換行:'\n'(ASCII:0x0a)
  • Windows下的換行:'\r\n'(ASCII:0x0d0a)
  • MacOS下的換行:'\r'(ASCII:0x0d)
  • 由于ASCII碼不同,Linux和MacOS的文本文件在Windows中的記事本打開時不換行。

(2)?文本文件和二進制文件區別:

  • Linux下打開文件,用不用ios::binary沒區別。
  • Windows下打開文件,如果不用ios::binary,則會造成①讀取文件時,所有的'\r\n'都會被當作'\n'處理,因此會少讀了一個字符'\r'。②寫入文件時,寫入單獨的'\n'時,系統會自動加'\r',因此多寫了一個字符'\r'。
  • 一般來說,使用二進制文件更加節省空間。例如,保存123456,若保存于文本文件則需要6個字節,而保存于二進制文件用一個int的字節就行了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14872.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue 點擊復制文本到剪貼板

一、首先在vue文件的template中定義復制按鈕 <div size"small" v-if"item.prop jadeCode" class"cell-container"><span>{{ scope.row.jadeCode }}</span> <button click"handleCopy(scope.row.jadeCode)" clas…

一周開發一個客服工單系統

開發一個客服工單系統在一周內完成&#xff0c;需要詳細的計劃和高效的執行。以下是一個詳細的開發計劃&#xff0c;涵蓋每天的主要任務和技術棧選擇&#xff1a; 演示效果&#xff1a;gofly.v1kf.com 技術棧選擇 前端&#xff1a;React.js 或 Vue.js后端&#xff1a;Go (Gin)數…

K8s是如何Watch的?

1. 概述 進入 K8s 的世界&#xff0c;會發現幾乎所有對象都被抽象為了資源(Resource)&#xff0c;包括 K8s Core Resources(Pod, Service, Namespace 等)、CRD、APIService 擴展的資源類型。同時 K8s 底層將這些資源統一抽象為了 RESTful 的存儲(Storage)&#xff0c;一方面服…

jellyfish安裝及使用(Bioinformatics工具-020)

01 背景 基因組survey以測序技術為基礎&#xff0c;基于小片段文庫的低深度測序&#xff0c;通過K-mer分析&#xff0c;快速獲得基因組大小、雜合度、重復序列比例等基本信息&#xff0c;為制定該物種的全基因組de novo測序策略提供有效依據。 jellyfish (水母) 是一個用于快…

Docker-鏡像遷移的三種方式=>備份恢復公有倉庫私有倉庫

制作好的鏡像要被別人使用&#xff0c;有三種方式&#xff1a; 1.先備份鏡像&#xff0c;別人通過u盤或者其它方式拷貝后&#xff0c;再恢復鏡像&#xff0c;這種方式比較麻煩 2.將制作的鏡像上傳到公共鏡像倉庫&#xff0c;被別人拉取后使用&#xff0c;但可能存在網絡不通暢或…

【零基礎C語言】內存函數

前言&#xff1a; 我們之前學過strcpy&#xff0c;strcmp等等函數&#xff0c;他們可以拷貝字符串和比較字符串等等&#xff0c;那么有沒有什么函數不光可以拷貝字符串還可以拷貝其他的數據呢&#xff0c;答案就是內存函數。 相較于字符串函數&#xff0c;內存函數可以拷貝的…

贖金信[簡單]

優質博文&#xff1a;IT-BLOG-CN 一、題目 給你兩個字符串&#xff1a;ransomNote和magazine&#xff0c;判斷ransomNote能不能由magazine里面的字符構成。如果可以&#xff0c;返回true&#xff1b;否則返回false。magazine中的每個字符只能在ransomNote中使用一次。 示例 …

DPDK實踐之(1)dpdk基礎使用

DPDK實踐之(1)dpdk基礎使用 Author: Once Day Date: 2024年5月19日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文檔可參考專欄&#xff1a;Linux基礎知識_Once…

java判斷日期格式的正則表達式

java判斷日期格式的正則表達式 在Java中&#xff0c;你可以使用String類的matches()方法來檢查一個字符串是否匹配特定的正則表達式。以下是一個用于判斷日期格式是否為YYYY-MM-DD的正則表達式的例子&#xff1a; public class DateValidator { public static boolean isVal…

C語言 | Leetcode C語言題解之第109題有序鏈表轉換二叉搜索樹

題目&#xff1a; 題解&#xff1a; int getLength(struct ListNode* head) {int ret 0;while (head ! NULL) {ret, head head->next;}return ret; }struct TreeNode* buildTree(struct ListNode** head, int left, int right) {if (left > right) {return NULL;}int …

Mac維護神器CleanMyMac X成為你的蘋果電腦得力助手

在數字化時代&#xff0c;Mac電腦已成為眾多用戶的首選。然而&#xff0c;隨著頻繁的使用和數據量的日益增長&#xff0c;許多Mac用戶面臨著系統雜亂、存儲空間不足以及隱私保護等問題。幸運的是&#xff0c;"CleanMyMac X"這款優化和清理工具應運而生&#xff0c;它…

ROCm上情感分析:使用循環神經網絡

15.2. 情感分析&#xff1a;使用循環神經網絡 — 動手學深度學習 2.0.0 documentation (d2l.ai) 代碼 import torch from torch import nn from d2l import torch as d2lbatch_size 64 train_iter, test_iter, vocab d2l.load_data_imdb(batch_size)class BiRNN(nn.Module):…

java抽象類,接口,枚舉練習題

第一題&#xff1a; 答案&#xff1a; class Animal{//成員變量protected String name;protected int weight;//構造方法public Animal(){this.name"refer";this.weight50;}public Animal(String name,int weight){this.namename;this.weightweight;}//成員方法publ…

Bugku Crypto 部分題目簡單題解(四)

目錄 python_jail 簡單的rsa 托馬斯.杰斐遜 這不是md5 進制轉換 affine Crack it rsa python_jail 啟動場景 使用虛擬機nc進行連接 輸入print(flag) 發現報錯&#xff0c;經過測試只能傳入10個字符多了就會報錯 利用python中help()函數&#xff0c;借報錯信息帶出flag變…

【力扣刷題筆記第三期】Python 數據結構與算法

先從簡單的題型開始刷起&#xff0c;一起加油啊&#xff01;&#xff01; 點個關注和收藏唄&#xff0c;一起刷題鴨&#xff01;&#xff01; 第一批題目 1.設備編號 給定一個設備編號區間[start, end]&#xff0c;包含4或18的編號都不能使用&#xff0c;如&#xff1a;418、…

對于map的新應用

題源codeforces1974 problemC 題目大意 定義當兩個三元組A和B中&#xff0c;滿足三元組中有且僅有兩個元素相等&#xff0c;比如 a 1 b 1 , a 2 b 2 , a 3 ! b 3 a_1b_1,a_2b_2,a_3!b_3 a1?b1?,a2?b2?,a3?!b3? 這只是一種情況&#xff0c;三種情況之一 解題思路 …

java抽象類和接口知識總結

一.抽象類 1.啥是抽象類 用專業語言描述就是&#xff1a;如果一個類中沒有包含足夠的信息來描繪一個具體的對象&#xff0c;這樣的類就是抽象類 當然這話說的也很抽象&#xff0c;所以我們來用人話來解釋一下抽象類 拋開編程語言這些&#xff0c;就以現實舉例&#xff0c;我…

每日練習之排序——鏈表的合并;完全背包—— 兌換零錢

鏈表的合并 題目描述 運行代碼 #include<iostream> #include<algorithm> using namespace std; int main() { int a[31];for(int i 1;i < 30;i)cin>>a[i];sort(a 1,a 1 30);for(int i 1;i < 30;i)cout<<a[i]<<" ";cout&…

Mysql之Innodb存儲引擎

1.Innodb數據存儲 innodb如今能夠做到mysql的默認數據存儲引擎&#xff0c;肯定有著其好處的&#xff0c;那么innodb有什么好處呢? 1. 當意外斷電或者重啟&#xff0c; InnoDB 能夠做到奔潰恢復&#xff0c;撤銷沒有提交的數據 2.InnoDB 存儲引擎維護自己的緩沖池&#xff0c…

UDS(ISO 14229)學習筆記

文章目錄 名詞縮寫Vector視頻筆記$10$27Fault Memory物理尋址和功能尋址UDS服務分類0x19服務0x14DTC汽車控制器(ECU)中DTC的狀態位物理尋址和功能尋址單幀 多幀 首幀 連續幀名詞縮寫 DTC Diagnostic Trouble Code FTB Fault Type Byte SID Service Identifier SF Subfunctio…