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ǔ)充知識(shí):
C語(yǔ)言 C++兩個(gè)版本 txt 文件讀取結(jié)構(gòu)體信息,寫入結(jié)構(gòu)體指針中,并以結(jié)構(gòu)體指針形式返回 txt文件行數(shù)未知
附加功能:采用 直接插入排序 方法 按總成績(jī)進(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)中存儲(chǔ)信息如下:
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;//自己動(dòng)手加上2行,目前不知道為什么,得到的行數(shù)總是比實(shí)際行數(shù)少兩行??
//獲取文件的行數(shù)--------------------------end
3.1、C++版本代碼如下:
思路:參考C++ txt 文件讀取,并寫入結(jié)構(gòu)體中
//利用 C++,將文件中的student類型的數(shù)據(jù)結(jié)構(gòu)信息 取出來,放在一個(gè)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;//自己動(dòng)手加上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)//之前一直錯(cuò)誤的原因是寫成了cin>>就是從鍵盤輸入了??!
{
s.totalScore = s.Chinese + s.math + s.English;
stu[i] = s;
++i;
// *stu++ = s;//錯(cuò)誤,這樣代替前兩行 一定錯(cuò)誤!! 暫時(shí)還不知道為什么??
}
in.close();
//-----------------------------------------------
return stu;
}
3.1、C語(yǔ)言版本代碼如下:
//將*.txt文件中的學(xué)生信息 存放到 學(xué)生結(jié)構(gòu)體指針中,并返回該結(jié)構(gòu)體指針
student* CreateStudentFromFile2(char *fname)//C語(yǔ)言的文件就可以 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;//錯(cuò)誤
stu[i] = s;
}
fclose(f);
return stu;
}
4、測(cè)試代碼
#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)信息 取出來,放在一個(gè)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)//之前一直錯(cuò)誤的原因是寫成了cin>>就是從鍵盤輸入了??!
{
s.totalScore = s.Chinese + s.math + s.English;
stu[i] = s;
++i;
// *stu++ = s;//錯(cuò)誤,這樣代替前兩行 一定錯(cuò)誤??! 暫時(shí)還不知道為什么??
}
in.close();
//-----------------------------------------------
return stu;
}
//將*.txt文件中的學(xué)生信息 存放到 學(xué)生結(jié)構(gòu)體指針中,并返回該結(jié)構(gòu)體指針
student* CreateStudentFromFile2(char *fname)//C語(yǔ)言的文件就可以 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;//自己動(dòng)手加上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;//錯(cuò)誤
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ù)右對(duì)齊
}
//直接插入排序 按總成績(jī)降序排列
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é)號(hào),調(diào)整學(xué)號(hào)所在對(duì)象的位置,整個(gè)Student對(duì)象 都會(huì)隨著學(xué)號(hào)的升序而跟著改變
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é)號(hào)\t姓名\t語(yǔ)文\t數(shù)學(xué)\t外語(yǔ)\t總成績(jī)" << endl;
cout << "before insertion sort: " << endl;
disp(s, len);
InsertionSort(s, len);//插入法排序成功 //根據(jù)成績(jī)排序
cout << "after insertion sort: " << endl;
disp(s, len);
DestroyStudentStruct(s);
cout << s << endl;
disp(s, len);
}
void test()
{
cout << "------C語(yǔ)言版本---test()---將txt中的結(jié)構(gòu)體信息寫入到 結(jié)構(gòu)體指針中--------" << endl;
student *s = CreateStudentFromFile2("student_info.txt");
cout << "學(xué)號(hào)\t姓名\t語(yǔ)文\t數(shù)學(xué)\t外語(yǔ)\t總成績(jī)" << endl;
cout << "before insertion sort: " << endl;
disp(s, len);
InsertionSort(s, len);//插入法排序成功 //根據(jù)成績(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)體中的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言的分支和循環(huán)語(yǔ)句你真的了解嗎
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的分支和循環(huán)語(yǔ)句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序的優(yōu)化算法
堆排序Heap?Sort就是利用堆進(jìn)行排序的方法,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序的優(yōu)化算法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
C語(yǔ)言實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

