最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作

 更新時間:2020年12月10日 09:27:14   作者:QT-Neal  
這篇文章主要介紹了C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

如下所示:

wang 18 001

li 19 002

zhao 20 003

代碼如下:

#include <string>
#include <iostream>
#include <fstream> 
using namespace std; 
struct people
{
 string name;
 int age;
 string id;
}p[20];
 
int main()
{
 int n = 0;
 ifstream in( "a.txt" , ios::in);
 if (!in.is_open())
 {
  cout << "Error: opening file fail" << endl;
  exit (1);
 }
 while (!in.eof() && n < 20)
 {
  in >> p[n].name >> p[n].age >> p[n].id;
  n++;
 }
 
 //test
 for ( int i = 0; i < n; ++i)
  cout << "name:" << p[i].name << " age:" << p[i].age << " id:" << p[i].id << endl;
  
 in.close();
 return 0;
}

補(bǔ)充知識:

C語言 C++兩個版本 txt 文件讀取結(jié)構(gòu)體信息,寫入結(jié)構(gòu)體指針中,并以結(jié)構(gòu)體指針形式返回 txt文件行數(shù)未知

附加功能:采用 直接插入排序 方法 按總成績進(jìn)行了降序排序

1、結(jié)構(gòu)體信息如下:

#define size 9
struct student//學(xué)生信息
{
 long int number;
 char name[size];
 int Chinese;
 int math;
 int English;
 int totalScore;
};

2、txt文件(student_info.txt)中存儲信息如下:

179328 何芳芳 89 100 98
179325 陳紅 86 100 88
179326 陸華 75 80 90
179324 張小儀 85 57 94
179327 張平 80 98 78
179320 木子 100 96 89
179329 海子 93 95 88

3、子函數(shù)代碼

獲取txt文件行數(shù):

 char *fname="student_info.txt";
 ifstream in(fname);
 if (!in){ cout << "No such a file" << endl; return NULL; }
 //獲取文件的行數(shù)--------------------------begin
 in.seekg(0, 2);//定位文件指針到文件末尾
 student s;
 len = in.tellg() / sizeof(s);//獲得文件行數(shù)
 len += 2;//自己動手加上2行,目前不知道為什么,得到的行數(shù)總是比實(shí)際行數(shù)少兩行??
 //獲取文件的行數(shù)--------------------------end

3.1、C++版本代碼如下:

思路:參考C++ txt 文件讀取,并寫入結(jié)構(gòu)體中

//利用 C++,將文件中的student類型的數(shù)據(jù)結(jié)構(gòu)信息 取出來,放在一個student類型的結(jié)構(gòu)指針中,并將student* 返回
int len;//文件行數(shù) 全局變量
student* CreateStudentFromFile(char *fname)
{
 ifstream in(fname);
 if (!in){ cout << "No such a file" << endl; return NULL; }
 //獲取文件的行數(shù)--------------------------begin
 in.seekg(0, 2);//定位文件指針到文件末尾
 student s;
 len = in.tellg() / sizeof(s);//獲得文件行數(shù)
 len += 2;//自己動手加上2行,目前不知道為什么,得到的行數(shù)總是比實(shí)際行數(shù)少兩行??
 //獲取文件的行數(shù)--------------------------end
 in.seekg(0, 0);//再重新定位文件指針到文件頭
 //---------將文件中的結(jié)構(gòu)體寫入到 結(jié)構(gòu)體指針中----
 student *stu = new student[len];
 int i = 0;
 while (in >> s.number >> s.name >> s.Chinese >> s.math >> s.English)//之前一直錯誤的原因是寫成了cin>>就是從鍵盤輸入了??!
 {
 s.totalScore = s.Chinese + s.math + s.English;
 stu[i] = s;
 ++i;
 // *stu++ = s;//錯誤,這樣代替前兩行 一定錯誤?。?暫時還不知道為什么??
 }
 in.close();
 //-----------------------------------------------
 return stu;
}

3.1、C語言版本代碼如下:

//將*.txt文件中的學(xué)生信息 存放到 學(xué)生結(jié)構(gòu)體指針中,并返回該結(jié)構(gòu)體指針
student* CreateStudentFromFile2(char *fname)//C語言的文件就可以 Okay!!
{
 FILE *f;
 f = fopen(fname, "r");
 if (!f){ cout << "No such a file" << endl; return NULL; }
 student s;
 fseek(f, 0, 2);//定位文件指針到文件末尾
 len = ftell(f) / sizeof(s);//獲得文件行數(shù)//不知道為什么,這樣得到的文件行數(shù)總是少兩行??
 rewind(f);// 指針重新回到文件開始
 len += 2;
 student *stu = (student *)malloc(len*sizeof(student));
 int i = 0;
 for (int i = 0; i < len; ++i)
 {
 fscanf(f, "%ld%s%d%d%d", &s.number, &s.name, &s.Chinese, &s.math, &s.English);
 s.totalScore = s.Chinese + s.math + s.English;
 // *stu++ = s;//錯誤
 stu[i] = s;
 }
 fclose(f);
 return stu;
}

4、測試代碼

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
using namespace std;
#define size 9
struct student
{
 long int number;
 char name[size];
 int Chinese;
 int math;
 int English;
 int totalScore;
};
//利用 C++,將文件中的student類型的數(shù)據(jù)結(jié)構(gòu)信息 取出來,放在一個student類型的結(jié)構(gòu)指針中,并將student* 返回
int len;//文件行數(shù) 全局變量
student* CreateStudentFromFile(char *fname)
{
 ifstream in(fname);
 if (!in){ cout << "No such a file" << endl; return NULL; }
 //獲取文件的行數(shù)--------------------------begin
 in.seekg(0, 2);//定位文件指針到文件末尾
 student s;
 len = in.tellg() / sizeof(s);//獲得文件行數(shù)
 in.seekg(0, 0);//再重新定位文件指針到文件頭
 len += 2;
 //獲取文件的行數(shù)--------------------------end
 //C++ txt 文件讀取,并寫入結(jié)構(gòu)體中
 //---------將文件中的結(jié)構(gòu)體寫入到 結(jié)構(gòu)體指針中----
 student *stu = new student[len];
 int i = 0;
 while (in >> s.number >> s.name >> s.Chinese >> s.math >> s.English)//之前一直錯誤的原因是寫成了cin>>就是從鍵盤輸入了?。?
 {
 s.totalScore = s.Chinese + s.math + s.English;
 stu[i] = s;
 ++i;
 // *stu++ = s;//錯誤,這樣代替前兩行 一定錯誤??! 暫時還不知道為什么??
 }
 in.close();
 //-----------------------------------------------
 return stu;
}
//將*.txt文件中的學(xué)生信息 存放到 學(xué)生結(jié)構(gòu)體指針中,并返回該結(jié)構(gòu)體指針
student* CreateStudentFromFile2(char *fname)//C語言的文件就可以 Okay!!
{
 FILE *f;
 f = fopen(fname, "r");
 if (!f){ cout << "No such a file" << endl; return NULL; }
 student s;
 fseek(f, 0, 2);//定位文件指針到文件末尾
 len = ftell(f) / sizeof(s);//獲得文件行數(shù)//不知道為什么,這樣得到的文件行數(shù)總是少兩行??
 rewind(f);// 指針重新回到文件開始
 len += 2;//自己動手加上2行
 student *stu = (student *)malloc(len*sizeof(student));
 int i = 0;
 for (int i = 0; i < len; ++i)
 {
 fscanf(f, "%ld%s%d%d%d", &s.number, &s.name, &s.Chinese, &s.math, &s.English);
 s.totalScore = s.Chinese + s.math + s.English;
 // *stu++ = s;//錯誤
 stu[i] = s;
 }
 fclose(f);
 return stu;
}
void DestroyStudentStruct(student *&s)
{
 if (s==NULL){ cout << "無信息" << endl; return; }
 delete[] s;
 s = NULL;
}
void disp(const student* s, int len)
{
 if (s == NULL){ cout << "該學(xué)生尚未登記,暫無信息。" << endl; return; }
 for (int i = 0; i < len; ++i)
 printf_s("%ld\t%s\t%3d\t%3d\t%3d\t%3d\n", s[i].number, s[i].name, s[i].Chinese, s[i].math, s[i].English, s[i].totalScore);//%3d:保證三位數(shù)右對齊
}
//直接插入排序 按總成績降序排列
void InsertionSort(student* s, int len)
{
 for (int i = 1; i < len; ++i)
 {
 for (int j = 0; j < i; ++j)
 {
  if (s[j].totalScore < s[i].totalScore)
  {
  student temp = s[i];//這樣的話,根據(jù)學(xué)號,調(diào)整學(xué)號所在對象的位置,整個Student對象 都會隨著學(xué)號的升序而跟著改變
  for (int k = i; k>j; --k)
   s[k] = s[k - 1];
  s[j] = temp;
  }
 }
 }
}
void test0()
{
 cout << "------C++版本---test0()---將txt中的結(jié)構(gòu)體信息寫入到 結(jié)構(gòu)體指針中--------" << endl;
 student *s = CreateStudentFromFile("student_info.txt");
 cout << "學(xué)號\t姓名\t語文\t數(shù)學(xué)\t外語\t總成績" << endl;
 cout << "before insertion sort: " << endl;
 disp(s, len);
 InsertionSort(s, len);//插入法排序成功 //根據(jù)成績排序
 cout << "after insertion sort: " << endl;
 disp(s, len);
 DestroyStudentStruct(s);
 cout << s << endl;
 disp(s, len);
}
void test()
{
 cout << "------C語言版本---test()---將txt中的結(jié)構(gòu)體信息寫入到 結(jié)構(gòu)體指針中--------" << endl;
 student *s = CreateStudentFromFile2("student_info.txt");
 cout << "學(xué)號\t姓名\t語文\t數(shù)學(xué)\t外語\t總成績" << endl;
 cout << "before insertion sort: " << endl;
 disp(s, len);
 InsertionSort(s, len);//插入法排序成功 //根據(jù)成績排序
 cout << "after insertion sort: " << endl;
 disp(s, len);
 DestroyStudentStruct(s);
 cout << s << endl;
 disp(s, len);
}
int main()
{
 test0();
 test();
 return 0;
}

以上這篇C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言中static與sizeof查缺補(bǔ)漏篇

    C語言中static與sizeof查缺補(bǔ)漏篇

    static在修飾變量的時候,如果是修飾全局變量,則跟全局變量功能一樣;如果是修改局部變量,則每次調(diào)用的時候,保持著上一次的值;而sizeof是用來判斷一個變量及數(shù)據(jù)類型所占字節(jié)數(shù)的,下面我們詳細(xì)來看看
    2022-07-07
  • 淺析C++構(gòu)造函數(shù)虛擬化

    淺析C++構(gòu)造函數(shù)虛擬化

    這篇文章主要介紹了C++構(gòu)造函數(shù)虛擬化的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí)c++構(gòu)造函數(shù),感興趣的朋友可以了解下
    2020-08-08
  • C語言中的狀態(tài)機(jī)設(shè)計深入講解

    C語言中的狀態(tài)機(jī)設(shè)計深入講解

    這篇文章主要給大家介紹了關(guān)于C語言狀態(tài)機(jī)設(shè)計的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C++使用一個棧實(shí)現(xiàn)另一個棧的排序算法示例

    C++使用一個棧實(shí)現(xiàn)另一個棧的排序算法示例

    這篇文章主要介紹了C++使用一個棧實(shí)現(xiàn)另一個棧的排序算法,結(jié)合實(shí)例形式分析了C++借助輔助棧實(shí)現(xiàn)棧排序算法的相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    這篇文章主要為大家詳細(xì)介紹了在圖片不被裁剪時,opencv如何實(shí)現(xiàn)繞圖片中任意點(diǎn)旋轉(zhuǎn)任意角度,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-09-09
  • C++如何實(shí)現(xiàn)定長內(nèi)存池詳解

    C++如何實(shí)現(xiàn)定長內(nèi)存池詳解

    內(nèi)存池根據(jù)存儲的元素的長度是否可變,分為變長,與定長兩種內(nèi)存池,這篇文章主要給大家介紹了關(guān)于C++如何實(shí)現(xiàn)定長內(nèi)存池的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)例幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • C++11中value category(值類別)及move semantics(移動語義)的介紹

    C++11中value category(值類別)及move semantics(移動語義)的介紹

    這篇文章主要給大家介紹了C++11中value category(值類別)及move semantics(移動語義)的介紹,文中介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • C++反轉(zhuǎn)字符串中單詞的字符順序的兩種方法

    C++反轉(zhuǎn)字符串中單詞的字符順序的兩種方法

    在處理字符串相關(guān)的問題時,反轉(zhuǎn)字符串中每個單詞的字符順序是一個常見的任務(wù),同時要保證空格和單詞的初始順序不變,下面我們將詳細(xì)介紹兩種解決該問題的方法,包括其解題思路和具體實(shí)現(xiàn)細(xì)節(jié),需要的朋友可以參考下
    2025-03-03
  • C++?auto關(guān)鍵字的小知識點(diǎn)分享

    C++?auto關(guān)鍵字的小知識點(diǎn)分享

    這篇文章主要是來和大家介紹一些C++中的小知識點(diǎn),本文將從auto關(guān)鍵字開始講起,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05

最新評論

奉贤区| 荥阳市| 麻江县| 芜湖县| 林周县| 道孚县| 甘德县| 景宁| 磐安县| 固始县| 旬邑县| 修水县| 河北区| 益阳市| 漠河县| 潢川县| 紫阳县| 石阡县| 乌拉特中旗| 太仆寺旗| 娱乐| 阿拉尔市| 江陵县| 顺昌县| 连城县| 松潘县| 独山县| 镇安县| 高台县| 溧阳市| 云安县| 正宁县| 麟游县| 濮阳县| 梓潼县| 金寨县| 宁海县| 健康| 万宁市| 衢州市| 柯坪县|