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语言 动态内存分配的详解及实例的相关资料,需要的朋友可以参考下
    2016-09-09
  • 单词小助手C语言版

    单词小助手C语言版

    这篇文章主要为大家详细介绍了C语言版的单词小助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C++ vector的用法小结

    C++ vector的用法小结

    这篇文章主要介绍了c++中,vector是一个十分有用的容器,下面对这个容器做一下总结
    2013-12-12
  • C++关键字volatile学习笔记

    C++关键字volatile学习笔记

    这篇文章主要为大家介绍了C++关键字volatile学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • C语言入门学习之fgets()函数和fputs()函数

    C语言入门学习之fgets()函数和fputs()函数

    fgetc() 和 fputc() 函数每次只能读写一个字符,速度较慢,实际开发中往往是每次读写一个字符串或者一个数据块,这样能明显提高效率,这篇文章主要给大家介绍了关于C语言入门学习之fgets()函数和fputs()函数的相关资料,需要的朋友可以参考下
    2021-11-11
  • C语言动态内存规划详解

    C语言动态内存规划详解

    这篇文章主要介绍了C语言动态内存的规划,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • VC实现A进程窗口嵌入到B进程窗口中显示的方法

    VC实现A进程窗口嵌入到B进程窗口中显示的方法

    这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下
    2014-07-07
  • C++跳转语句之Goto对变量定义的影响详解

    C++跳转语句之Goto对变量定义的影响详解

    goto语句也被称为无条件转移语句,这篇文章主要介绍了C++跳转语句之Goto对变量定义的影响,文中通过示例代码解文字介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面跟着小编一起来学习学习吧。
    2016-11-11
  • C++11/14 线程中使用Lambda函数的方法

    C++11/14 线程中使用Lambda函数的方法

    这篇文章主要介绍了C++11/14 线程中使用Lambda函数的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • c语言 两字符串交叉合并实例

    c语言 两字符串交叉合并实例

    今天小编就为大家分享一篇c语言 两字符串交叉合并实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论