欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++ txt 文件读取,并写入结构体中的操作

时间:2022-01-14 11:11:00|栏目:C代码|点击:

如下所示:

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 9
struct student//学生信息
{
 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、子函数代码

获取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行,目前不知道为什么,得到的行数总是比实际行数少两行??
 //获取文件的行数--------------------------end

3.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 9
struct 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++实现推箱子游戏

栏    目:C代码

下一篇:纯C语言实现五子棋

本文标题:C++ txt 文件读取,并写入结构体中的操作

本文地址:http://www.codeinn.net/misctech/190177.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有