C/C++:读写txt/二进制文件
生活随笔
收集整理的這篇文章主要介紹了
C/C++:读写txt/二进制文件
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
fopen() 函數(shù)用來打開一個(gè)文件,它的原型為:
FILE *fopen(char *filename, char *mode);
filename為文件名(包括文件路徑),mode為打開方式,它們都是字符串。fopen() 會(huì)獲取文件信息,包括文件名、文件狀態(tài)、當(dāng)前讀寫位置等,并將這些信息保存到一個(gè)FILE類型的結(jié)構(gòu)體變量中,然后將該變量的地址返回。
FILE是在stdio.h頭文件中定義的一個(gè)結(jié)構(gòu)體,用來保存文件信息。
如果希望接收 fopen() 的返回值,就需要定義一個(gè) FILE 類型的指針。例如:
FILE *fp = fopen("demo.txt", "r");
表示以“只讀”方式打開當(dāng)前目錄下的 demo.txt 文件,并使 fp 指向該文件,這樣就可以通過 fp 來操作 demo.txt 了。fp 通常被稱為文件指針。
寫入內(nèi)容到txt文件
FILE* fp = fopen("model_vertices_recalc.txt", "a+");//r(read),w(write),a(append) fprintf(fp, "This is testing for fprintf...\n");//第二個(gè)形參類型:const char* _Format fprintf(fp, "This is testing for %d fprintf...\n",5);//第二個(gè)形參支持兩種方式 fputs("This is testing for fputs...\n", fp);//這種方式不支持寫入變量 fputc('M', fp);//這個(gè)是寫入字符 fclose(fp); return 0;從txt文件讀取內(nèi)容
FILE* fp = NULL; char buff[255];fp = fopen("model_vertices_recalc.txt", "r");fgets(buff, 255, (FILE*)fp);//讀取一行字符串 printf("0: %s\n", buff);fscanf(fp, "%s", buff);//遇到空格停止 printf("1: %s\n", buff); int i = 0; sscanf(buff, "%d", &i);//將buff中的數(shù)據(jù)寫入到int類型中 cout << i << endl;fgets(buff, 255, (FILE*)fp);//讀取整行,從上面那個(gè)空格出讀取剩余的整行 printf("2: %s\n", buff);fgets(buff, 255, (FILE*)fp); printf("3: %s\n", buff); fclose(fp);寫入數(shù)據(jù)到二進(jìn)制文件
FILE* fp = NULL;fp = fopen("test.bin", "wb+");for (int i = 0; i < 10; i++){fwrite((void*)&i, sizeof(int), 1, fp);//將10個(gè)int數(shù)據(jù)一次寫入文件}fclose(fp);從二進(jìn)制文件中讀取數(shù)據(jù)
FILE* fp = NULL;fp = fopen("test.bin", "rb");int a[10];for (int i = 0; i < 10; i++){fread((void*)&a[i], sizeof(int), 1, fp);//讀取上面寫入的int給到數(shù)組a}for (size_t i = 0; i < 10; i++){cout << a[i] << endl;}fseek(fp, sizeof(int)*3, SEEK_SET);//對(duì)文件指針重新定位,讀取第四個(gè)數(shù)int b;fread((void*)&b, sizeof(int), 1, fp);cout << b << endl;fclose(fp);?
c++將txt中的數(shù)據(jù)保存為二進(jìn)制文件
//==============================//將txt中的數(shù)據(jù)保存為二進(jìn)制文件,txt文件中每行有四個(gè)數(shù)值,將其保存為float數(shù)據(jù)//存入bin文件內(nèi)String vertices_file = "D:\\model_vertices_recalc.txt";std::ifstream fv(vertices_file, std::ios::in);std::ofstream outFile("TwoPairCoordinate.bin", std::ios::out | std::ios::binary);if (!outFile){std::cerr << "failed to open the file." << std::endl;return -1;}float cor;std::vector<float> vertices;while (!fv.eof()){fv >> cor;outFile.write(reinterpret_cast<const char*>(&cor), sizeof(float));}fv.close();outFile.close();C++將txt中的兩列數(shù)據(jù)分別讀取出來,存到兩個(gè)向量中
int main() {ifstream ifs; //創(chuàng)建流對(duì)象ifs.open("***.txt", ios::in); //打開文件if (!ifs.is_open()) //判斷文件是否打開{cout << "打開文件失敗!!!";return 0;}vector<float> target_1, target_2; //用于存放目標(biāo)數(shù)據(jù)vector<string> item; //用于存放文件中的一行數(shù)據(jù)string temp; //把文件中的一行數(shù)據(jù)作為字符串放入容器中while (getline(ifs, temp)) //利用getline()讀取每一行,并放入到 item 中{item.push_back(temp);}ifs.close(); //關(guān)閉文件,此時(shí)已經(jīng)把數(shù)據(jù)全部讀出來放在item里了,后面只需操作item即可for (auto it = item.begin(); it != item.end(); it++){cout << *it << endl;istringstream istr(*it); //其作用是把字符串分解為單詞(在此處就是把一行數(shù)據(jù)分為單個(gè)數(shù)據(jù))string str;int count = 1; //統(tǒng)計(jì)一行數(shù)據(jù)中單個(gè)數(shù)據(jù)個(gè)數(shù)//獲取文件中的第 1、2 列數(shù)據(jù)while (istr >> str) //以空格為界,把istringstream中數(shù)據(jù)取出放入到依次s中{if (count == 1) //獲取第1列數(shù)據(jù){float r = atoi(str.c_str()); //數(shù)據(jù)類型轉(zhuǎn)換,將string類型轉(zhuǎn)換成float,如果字符串不是有數(shù)字組成,則字符被轉(zhuǎn)化為 0target_1.push_back(r);}else if (count == 2)//獲取第2列數(shù)據(jù){float r = atoi(str.c_str()); //數(shù)據(jù)類型轉(zhuǎn)換,將string類型轉(zhuǎn)換成floattarget_2.push_back(r);}count++;}}cout << "數(shù)據(jù)個(gè)數(shù)(灰度256以內(nèi)):" << target_1.size() << endl;auto it = target_1.begin();auto itt = target_2.begin();for (; it != target_1.end(), itt != target_2.end(); it++, itt++){cout << *it << " \t" << *itt << endl;}system("pause");return 0; }上面的方法假如操作的文件中有小數(shù)部分,會(huì)忽略掉,下面這種可以正常把小數(shù)部分讀取出來
int main() {vector<float> V;vector<float> SRC_GRAY_ARR, SRC_LIGHT_ARR;ifstream data("***.txt", ios::in);float d;int N = 0;while (data >> d){if (N % 2 == 0){SRC_GRAY_ARR.push_back(d);}else{SRC_LIGHT_ARR.push_back(d);}N++;}data.close();auto it = SRC_GRAY_ARR.begin();auto itt = SRC_LIGHT_ARR.begin();for (; it != SRC_GRAY_ARR.end(), itt != SRC_LIGHT_ARR.end(); it++, itt++){cout << *it << " \t" << *itt << endl;}system("pause");return 0; }將opencv Mat保存為二進(jìn)制文件
std::ofstream fout1("C:/Users/**.bin", std::ios::binary | std::ios::trunc); for (int i = 0; i < map_rows; i++) {for (int j = 0; j < map_cols; j++){fout1.write(reinterpret_cast<char*>(&warp_map.at<float>(i, j)), sizeof(float));} } fout1.close();總結(jié)
以上是生活随笔為你收集整理的C/C++:读写txt/二进制文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 集群部署中解决定时任务重复执行的问题-r
- 下一篇: POJ 2323 贪心