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

 更新时间:2020年12月10日 09:27:14   作者:QT-Neal  
这篇文章主要介绍了C++ txt 文件读取,并写入结构体中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

如下所示:

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++ txt 文件读取,并写入结构体中的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言的分支和循环语句你真的了解吗

    C语言的分支和循环语句你真的了解吗

    这篇文章主要为大家详细介绍了C语言的分支和循环语句,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言数据结构之堆排序的优化算法

    C语言数据结构之堆排序的优化算法

    堆排序Heap Sort就是利用堆进行排序的方法,下面这篇文章主要给大家介绍了关于C语言数据结构之堆排序的优化算法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 使用钩子如何锁定键盘的方法分享

    使用钩子如何锁定键盘的方法分享

    锁键盘一般用钩子实现,所以难度稍大,不过下面这个程序当简单,而且连钩子所需要DLL也省了
    2014-01-01
  • OpenCV实现人脸检测

    OpenCV实现人脸检测

    这篇文章主要为大家详细介绍了OpenCV实现人脸检测的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++多继承同名隐藏实例详细介绍

    C++多继承同名隐藏实例详细介绍

    多继承可以看作是单继承的扩展。所谓多继承是指派生类具有多个基类,派生类..本文将对C++多继承同名隐藏实例进行分析
    2012-11-11
  • C语言实现图书管理系统

    C语言实现图书管理系统

    这篇文章主要为大家详细介绍了C语言实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言实现顺序表的插入删除

    C语言实现顺序表的插入删除

    这篇文章主要介绍了C语言实现顺序表的插入删除,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • C语言 sprintf 函数详情

    C语言 sprintf 函数详情

    这篇文章主要介绍了C语言 sprintf 函数,文章主要包括sprintf 函数简介、sprintf 函数使用和简单说明了一下sprintf、fprintf、printf 函数区别,需要的朋友可以参考一下文章的具体内容
    2021-10-10
  • 基于c的for循环中改变变量值的问题

    基于c的for循环中改变变量值的问题

    本篇文章是对c语言的for循环中改变变量值的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ const和指针详情

    C++ const和指针详情

    这篇文章主要介绍了C++ const和指针,关于使用const来修饰指针,有两种不同的方式。第一种是让指针指向一个常量对象,这样可以防止使用该指针进行修改指向的值。第二种则是将指针本身声明为常量,可以防止改变指针指向的位置,下面来看看文章的详细内容
    2021-11-11

最新评论