C++读取txt数据为二维数组 将数据保存到txt文本中
生活随笔
收集整理的這篇文章主要介紹了
C++读取txt数据为二维数组 将数据保存到txt文本中
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ??C++讀取txt數(shù)據(jù)為二維數(shù)組 保存txt文本數(shù)據(jù)
? ? C++文件讀寫操作有:ofstream,ifstream,fstream: #include <fstream> ofstream //文件寫操作 內(nèi)存寫入存儲(chǔ)設(shè)備 ifstream //文件讀操作,存儲(chǔ)設(shè)備讀區(qū)到內(nèi)存中 fstream //讀寫操作,對(duì)打開的文件可進(jìn)行讀寫操作 ? ?詳細(xì)資料請(qǐng)參考:http://blog.csdn.net/kingstar158/article/details/6859379 ? ?C++獲取二維數(shù)組的行列數(shù)的方法://對(duì)于type array[A][B];形式的二維數(shù)組,可以通過計(jì)算sizeof獲取行列數(shù)。 sizeof(array[0][0])//為一個(gè)元素占用的空間, sizeof(array[0]) //為一行元素占用的空間, sizeof(array) //為整個(gè)數(shù)組占用的空間, 行數(shù) = sizeof(array)/sizeof(array[0]); 列數(shù) = sizeof(array[0])/sizeof(array[0][0]); #include <iostream> using namespace std; template <class T> int getArrayLen(T& array) //使用模板定義一個(gè)函數(shù)getArrayLen,該函數(shù)將返回?cái)?shù)組array的長度 { return (sizeof(array) / sizeof(array[0])); } int main() { char a[] = {'1','2','3'}; cout << getArrayLen(a) << endl; return 0; } 輸出為3
例子:
【1】C++讀取txt數(shù)據(jù)為二維數(shù)組
? ? ?imageData.txt文本的數(shù)據(jù)如下:
10.0 25 30 100 200 1000 1 2 31 2 3
? ? C++讀取imageData.txt文本的數(shù)據(jù),并將數(shù)據(jù)轉(zhuǎn)存為二維數(shù)組的方法
#include "stdafx.h" #include <iostream> #include <cstring> #include <io.h> #include <fstream> using namespace std;//txt文本必須是txtRows行,txtCols列存儲(chǔ)的文本數(shù)據(jù) #define readDataPath "D:\\imageData.txt"//txt文本的路徑 #define txtRows 4 //txt行數(shù) #define txtCols 3 //txt列數(shù) int main() {float txtData[txtRows][txtCols];int i, j;FILE* fp = fopen(readDataPath, "r"); //打開文件 if (fp == NULL){printf("文件讀取錯(cuò)誤...");return -1;}for (i = 0; i < txtRows; i++){for (j = 0; j < txtCols; j++){fscanf(fp, "%f", &txtData[i][j]);/*每次讀取一個(gè)數(shù),fscanf函數(shù)遇到空格或者換行結(jié)束*/}fscanf(fp, "\n");}fclose(fp);for (i = 0; i < txtRows; i++){for (j = 0; j < txtCols; j++){printf("%.1f ", txtData[i][j]);//輸出 }printf("\n");}return 0; }? ?運(yùn)行結(jié)果:
【2】讀取txt文本中的字符
? ?imageName.txt文本的數(shù)據(jù)如下:
? ?C++讀取方法如下:
// CppPython.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 //#include "stdafx.h" #include <fstream> #include <string> #include <iostream> using namespace std;//txt文本每行存儲(chǔ)一個(gè)字符串 #define readDataPath "D:\\imageName.txt" //txt文本的路徑 int main() {ifstream txtStream(readDataPath);string line;if (!txtStream.is_open())cout << "Error opening file";//(1)推薦這個(gè)寫法while (getline(txtStream, line)) // line中不包括每行的換行符{cout << line << endl;}//(2)使用eof()判斷,會(huì)多出一行空的while (!txtStream.eof()){getline(txtStream, line);cout << line << endl;}//或者用字符數(shù)組存儲(chǔ)char buffer[256];while (!txtStream.eof())//eof():如果讀文件到達(dá)文件末尾,返回true。{txtStream.getline(buffer, 100);cout << buffer<< endl;}return 0; }【3】txt文本復(fù)雜的情況
? ? 假設(shè)data.txt的數(shù)據(jù)如下:?每行是一個(gè)樣本,每行的第1列是一個(gè)字符串,其余是整型的數(shù)據(jù)
1.jpg 11 12 13 14 15 2.jpg 1 2 3 4 5 3.jpg 111 121 131 141 151
? ?這里把第1列的字符串保存在vector中,其余數(shù)據(jù)保存在二維數(shù)組data中,C++實(shí)現(xiàn)代碼如下:
#include <fstream> #include <string> #include "vector" #include <iostream> using namespace std;//txt文本的路徑 #define readDataPath "D:\\MyGitPro\\imageData\\data.txt" #define txtRows 3//txt文本行數(shù) #define txtCols 6//txt文本列數(shù)struct fileData {vector<string> name;//第1列int data[txtRows][txtCols - 1];//保存txt文本的數(shù)據(jù)(第2列開始) };fileData loadFileData(char* path);int main() {fileData m_fileData = loadFileData(readDataPath);for (int i = 0; i < m_fileData.name.size(); i++){cout << m_fileData.name.at(i) << endl;}int data[txtRows][txtCols - 1];memcpy(data, m_fileData.data, sizeof(data));for (size_t row=0;row<txtRows;row++){for (size_t col = 0; col < txtCols - 1; col++){cout << data[row][col]<<",";}cout << endl;} }fileData loadFileData(char* path) {fileData m_fileData;char name[81];std::vector<string> v_name;int txtData[txtRows][txtCols - 1];int i, j;FILE* fp = fopen(path, "r"); //打開文件 if (fp == NULL){printf("文件讀取錯(cuò)誤...");return m_fileData;}for (i = 0; i < txtRows; i++){for (j = 0; j < txtCols; j++){if (j == 0){fscanf(fp, "%s", name);v_name.push_back(name);}else {fscanf(fp, "%d", &txtData[i][j - 1]);/*每次讀取一個(gè)數(shù),fscanf函數(shù)遇到空格或者換行結(jié)束*/}}fscanf(fp, "\n");}fclose(fp);memcpy(m_fileData.data, txtData, sizeof(m_fileData.data));m_fileData.name = v_name;return m_fileData; }
【4】C++將數(shù)據(jù)保存到txt文本中
#include "stdafx.h" #include <fstream> #include <string> #include "vector" #include <iostream> using namespace std;//txt文本保存的路徑 #define writeDataPath "D:\\imageName.txt" int main() {fstream fout(writeDataPath);//這里采用構(gòu)造方法,也可以使用open()方法vector<string> imageName;imageName.push_back("1.jpg");imageName.push_back("2.jpg");imageName.push_back("3.jpg");for (int i = 0; i < imageName.size(); i++){fout << imageName.at(i) << endl;}cout << "數(shù)據(jù)保存完畢..." << endl; }上面的是覆蓋保存方法,若想在原文末尾加上新數(shù)據(jù),只需要在fstream 的構(gòu)造方法或者open()的第二個(gè)參數(shù)傳入ios::app即可,如:
fstream fout;fout.open(writeDataPath ?, ios::app);
下面給出一個(gè)函數(shù):
void writeDatatxt(string path, string data,bool bCover) {//fstream fout(path, ios::app);fstream fout;if (bCover){fout.open(path);//默認(rèn)是:ios_base::in | ios_base::out}else{fout.open(path, ios::app);//所有寫入附加在文件末尾}//fstream fout(path);fout << data << endl;fout.flush();fout.close(); }總結(jié)
以上是生活随笔為你收集整理的C++读取txt数据为二维数组 将数据保存到txt文本中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV FileStorage类的
- 下一篇: C++数组(一维、二维、三维)的动态分配