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语言中static与sizeof查缺补漏篇

    C语言中static与sizeof查缺补漏篇

    static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样;如果是修改局部变量,则每次调用的时候,保持着上一次的值;而sizeof是用来判断一个变量及数据类型所占字节数的,下面我们详细来看看
    2022-07-07
  • 浅析C++构造函数虚拟化

    浅析C++构造函数虚拟化

    这篇文章主要介绍了C++构造函数虚拟化的相关资料,文中讲解非常细致,帮助大家更好的理解和学习c++构造函数,感兴趣的朋友可以了解下
    2020-08-08
  • C语言中的状态机设计深入讲解

    C语言中的状态机设计深入讲解

    这篇文章主要给大家介绍了关于C语言状态机设计的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C++使用一个栈实现另一个栈的排序算法示例

    C++使用一个栈实现另一个栈的排序算法示例

    这篇文章主要介绍了C++使用一个栈实现另一个栈的排序算法,结合实例形式分析了C++借助辅助栈实现栈排序算法的相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • OpenCV实现绕图片中任意角度旋转任意角度

    OpenCV实现绕图片中任意角度旋转任意角度

    这篇文章主要为大家详细介绍了在图片不被裁剪时,opencv如何实现绕图片中任意点旋转任意角度,文中的示例代码讲解详细,需要的可以参考一下
    2022-09-09
  • C++如何实现定长内存池详解

    C++如何实现定长内存池详解

    内存池根据存储的元素的长度是否可变,分为变长,与定长两种内存池,这篇文章主要给大家介绍了关于C++如何实现定长内存池的相关资料,需要的朋友可以参考下
    2021-09-09
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现

    这篇文章主要介绍了C语言数据结构旋转链表的实现的相关资料,这里提供实例帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • C++11中value category(值类别)及move semantics(移动语义)的介绍

    C++11中value category(值类别)及move semantics(移动语义)的介绍

    这篇文章主要给大家介绍了C++11中value category(值类别)及move semantics(移动语义)的介绍,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • C++反转字符串中单词的字符顺序的两种方法

    C++反转字符串中单词的字符顺序的两种方法

    在处理字符串相关的问题时,反转字符串中每个单词的字符顺序是一个常见的任务,同时要保证空格和单词的初始顺序不变,下面我们将详细介绍两种解决该问题的方法,包括其解题思路和具体实现细节,需要的朋友可以参考下
    2025-03-03
  • C++ auto关键字的小知识点分享

    C++ auto关键字的小知识点分享

    这篇文章主要是来和大家介绍一些C++中的小知识点,本文将从auto关键字开始讲起,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-05-05

最新评论