时间:2021-05-20
如下所示:
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;}补充知识:
C语言 C++两个版本 txt 文件读取结构体信息,写入结构体指针中,并以结构体指针形式返回 txt文件行数未知
附加功能:采用 直接插入排序 方法 按总成绩进行了降序排序
1、结构体信息如下:
#define size 9struct student//学生信息{ long int number; char name[size]; int Chinese; int math; int English; int totalScore;};2、txt文件(student_info.txt)中存储信息如下:
179328 何芳芳 89 100 98179325 陈红 86 100 88179326 陆华 75 80 90179324 张小仪 85 57 94179327 张平 80 98 78179320 木子 100 96 89179329 海子 93 95 883、子函数代码
获取txt文件行数:
char *fname="student_info.txt"; ifstream in(fname); if (!in){ cout << "No such a file" << endl; return NULL; } //获取文件的行数--------------------------begin in.seekg(0, 2);//定位文件指针到文件末尾 student s; len = in.tellg() / sizeof(s);//获得文件行数 len += 2;//自己动手加上2行,目前不知道为什么,得到的行数总是比实际行数少两行?? //获取文件的行数--------------------------end3.1、C++版本代码如下:
思路:参考C++ txt 文件读取,并写入结构体中
//利用 C++,将文件中的student类型的数据结构信息 取出来,放在一个student类型的结构指针中,并将student* 返回int len;//文件行数 全局变量student* CreateStudentFromFile(char *fname){ ifstream in(fname); if (!in){ cout << "No such a file" << endl; return NULL; } //获取文件的行数--------------------------begin in.seekg(0, 2);//定位文件指针到文件末尾 student s; len = in.tellg() / sizeof(s);//获得文件行数 len += 2;//自己动手加上2行,目前不知道为什么,得到的行数总是比实际行数少两行?? //获取文件的行数--------------------------end in.seekg(0, 0);//再重新定位文件指针到文件头 //---------将文件中的结构体写入到 结构体指针中---- 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文件中的学生信息 存放到 学生结构体指针中,并返回该结构体指针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);//获得文件行数//不知道为什么,这样得到的文件行数总是少两行?? 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 9struct student{ long int number; char name[size]; int Chinese; int math; int English; int totalScore;};//利用 C++,将文件中的student类型的数据结构信息 取出来,放在一个student类型的结构指针中,并将student* 返回int len;//文件行数 全局变量student* CreateStudentFromFile(char *fname){ ifstream in(fname); if (!in){ cout << "No such a file" << endl; return NULL; } //获取文件的行数--------------------------begin in.seekg(0, 2);//定位文件指针到文件末尾 student s; len = in.tellg() / sizeof(s);//获得文件行数 in.seekg(0, 0);//再重新定位文件指针到文件头 len += 2; //获取文件的行数--------------------------end //C++ txt 文件读取,并写入结构体中 //---------将文件中的结构体写入到 结构体指针中---- 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文件中的学生信息 存放到 学生结构体指针中,并返回该结构体指针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);//获得文件行数//不知道为什么,这样得到的文件行数总是少两行?? 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 << "该学生尚未登记,暂无信息。" << 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:保证三位数右对齐}//直接插入排序 按总成绩降序排列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];//这样的话,根据学号,调整学号所在对象的位置,整个Student对象 都会随着学号的升序而跟着改变 for (int k = i; k>j; --k) s[k] = s[k - 1]; s[j] = temp; } } }}void test0(){ cout << "------C++版本---test0()---将txt中的结构体信息写入到 结构体指针中--------" << endl; student *s = CreateStudentFromFile("student_info.txt"); cout << "学号\t姓名\t语文\t数学\t外语\t总成绩" << endl; cout << "before insertion sort: " << endl; disp(s, len); InsertionSort(s, len);//插入法排序成功 //根据成绩排序 cout << "after insertion sort: " << endl; disp(s, len); DestroyStudentStruct(s); cout << s << endl; disp(s, len);}void test(){ cout << "------C语言版本---test()---将txt中的结构体信息写入到 结构体指针中--------" << endl; student *s = CreateStudentFromFile2("student_info.txt"); cout << "学号\t姓名\t语文\t数学\t外语\t总成绩" << endl; cout << "before insertion sort: " << endl; disp(s, len); InsertionSort(s, len);//插入法排序成功 //根据成绩排序 cout << "after insertion sort: " << endl; disp(s, len); DestroyStudentStruct(s); cout << s << endl; disp(s, len);}int main(){ test0(); test(); return 0;}以上这篇C++ txt 文件读取,并写入结构体中的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
默认明白C++的文件输入输出流方法:新建一个中间文件,逐行读取原文件(test.txt)的内容并写入到中间文件(temp.txt),遇到需要删除的内容则跳过。再
在实际工程中,经常遇到需要读取txt文件,txt文件中存的是一些小数或者整型数据,在C++中,可以利用string类和ifstream库文件对txt进行的读取,
C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。C++中的结构体和类的异同:
C++文件查找在C++中我们要如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct_finddat
creazy.txt文件有4G,逐行读取其内容并写入monday.txt文件里。defcreazyRead():'''''withopen("e:creazy.