c++读取数据文件到数组的实例

  • 时间:
  • 6341人关注

今天小编就为大家分享一篇c++读取数据文件到数组的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,另外这篇文章主要知识点是关于c++、数据文件、数组、c++的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:c++
  • 编辑整理:容弘懿
  • 教程字数:733字节
  • 阅读时间:大概10分钟
  • 下载本教程(DOC版)
  • C++ STL标准程序库开发指南
  • 零基础学C++(第2版)
  • C++编程基础:标准库编程
  • C++面向对象程序设计(第2版)
  • C++语言导学
  • 在刷题过程中,遇到的读取文件问题,只是记录自己的问题,新手~

    如果在一个txt文件当中有以下数据

    1

    2 3

    4 5 6

    7 8 9 10

    1、如果我们只是简单将这些数据保存在一个数组中:

    #include <iostream>
    #include <fstream>
    using namespace std;
     
    int main()
    {
     int i,datalen=0;
     double num[100];
     ifstream file("data.txt");
     while( ! file.eof() )
     file>>num[datalen++];
     for(int i=0;i<datalen;i++)
     {
      cout<<num[i]<<" ";
     }
     file.close();
     return 0;
    }
    

    结果如下:

    2、但是如果我们想要和数据文件一样的形式:

    #include <iostream>
    #include <fstream>
    using namespace std;
     
    int main()
    {
     double num[10][10];
     ifstream file("data.txt");
     for(int i=1;i<=4;i++)
     {
      for(int j=1;j<=i;j++)
      {
       file>>num[i][j];
      }
     }
     for(int i=1;i<=4;i++)
     {
      for(int j=1;j<=i;j++)
      {
       cout<<num[i][j]<<" ";
      }
      cout<<endl;
     }
     file.close();
     return 0;
    }
    

    得到的就是数据文件的形式了

    当然这是读取到double数组。自行设置。

    以上这篇c++读取数据文件到数组的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

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

    7小时10分钟前回答

    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语言实现自动给QQ好友发窗口抖动

    下一篇:ShellExecute函数怎么使用

    相关内容

    • 如何用Java实现将容器 Map中的内容保存到数组

      这篇文章主要介绍了Java实现将容器 Map中的内容保存到数组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

      05-03Java Map内容保存数组

      阅读更多
    • java如何定义数组

      Java中数组定义的三种方式 1.先声明 2.分配空间 3.赋值 public class arr{ public static void main(String[] args){ int[] arr; //先声明 arr=new int[5]; //分配空间 for(int i=0;i5;i++)arr[i]=i*10; //赋值 for(int i=0;i5;i++){ System.out.println(arr[+i+]=+arr[i]); } }} 结果: 方法二: 1.声明并分配空间 2.赋值

      04-27java定义数组方法

      阅读更多
    • 实现Python3数组旋转的3种算法实例

      在本篇文章里小编给大家整理的是一篇关于实现Python3数组旋转的3种算法实例内容,需要的朋友们可以学习参考下。

      04-163种算法实现Python3数组的旋转

      阅读更多
    • java如何增加数组长度

      java中的数组是定长的,无法动态增加长度。如果要扩充数组,只能通过重新定义数组,把旧数组内容拷贝到新数组中。 例如: 1、定义一个旧数组 int[] arrOld = new int[2];//旧数组定义 2、要扩充数组长度到3,需要重新定义数组 int[] arrNew = new int[3];//定义新数组 for(int i=0;iarrOld.length;i++){ arrNew[i] = arrOld[i];//把旧数组中的元素拷贝到新数组中

      12-18java怎样扩充数组长度

      阅读更多
    • java中数组是引用数据类型吗

      可以,数组中元素可以是任何类型的。如一个类类型的数组类名[] arr = new 类名[大小];那么这个数组就是存放类的,类就是这个数组中的引用类型元素。

      12-15java里数组是引用数据类型吗

      阅读更多
    • Google C++编程风格指南

      Google C++编程风格指南

      Google C++编程风格指南 是一套Google C++ 风格指南中文版,编码规范,中文标准,由网友新整理的Google代码规范,方便大家学习使用,可以节省大家整理时间,需要的朋友可下载试试! 本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。 风格,也被视为可读性,主要指称管理C++代码的习惯。使用术语风格有点用词不当,因为这些习惯远不止源代码文件格式这么简

      大小:1.66 MBC++编程

      点击下载
    • c++ 面向对象高效编程

      c++ 面向对象高效编程

      《 C++面向对象高效编程(第2版) 》的所有内容都是经验之谈。书中的练习都建立在Kayshav多年的C+++经验基础上。Kayshav不仅详尽地解释了面向对象的概念以及从理论上介绍C++的语言特性,还介

      大小:338 MBc++

      点击下载
    • C++入门经典

      C++入门经典

      C++入门经典(第9版) 是深受师生欢迎的优秀C++入门教材。作者结合自己多年的教学经验精心设计并编撰了本书内容。采用了很多便于巩固所学知识的设计,例如各章开头的小节总览,书中随处

      大小:302.5 MBC++

      点击下载
    • Node.js:来一打(C++ 扩展)

      Node.js:来一打(C++ 扩展)

      Node.js做为近些年兴盛的这种程序编写运作时,托V8模块的福,在做为后端开发服务项目时会较为高的运作高效率,在许多情景下针对人们的平时开发设计充足用了。但是,它更为开发人员开过

      大小:146 MBNode.js

      点击下载

    学习笔记

    26小时1分钟前回答

    c++读写文件流实例程序讲解

    掌握文本文件读写的方法 了解二进制文件的读写方法 C++文件流: 复制代码 代码如下: fstream // 文件流 ifstream // 输入文件流 ofstream // 输出文件流 //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #includeiomanip.h #includefstream.h void main() { ofstream f1("d:\\me.txt"); //打开文件用于写,若文件不存在就创建它 if(!f1)return; //打开文件失败则结束运行 f1setw(20)"姓名:""廉东方"endl; //使用插入运算符写文件内容 f1setw(20)"家庭地址:""河南郑州"endl; f1.close(); //关闭文件 } 运行后打开文件d:\me.txt,其内容如:姓名:廉东方家庭地址:河南郑州 文件操作: 打开文件 文件名 注意路径名中的斜杠要双写,……

    30小时18分钟前回答

    C++读写INI配置文件的类实例

    本文实例讲述了C++读写INI配置文件的类。分享给大家供大家参考。具体如下: 1. IniReader.h文件: #ifndef INIREADER_H#define INIREADER_H#include windows.hclass CIniReader{public: CIniReader(LPCTSTR szFileName); int ReadInteger(LPCTSTR szSection, LPCTSTR szKey, int iDefaultValue); float ReadFloat(LPCTSTR szSection, LPCTSTR szKey, float fltDefaultValue); bool ReadBoolean(LPCTSTR szSection, LPCTSTR szKey, bool bolDefaultValue); LPTSTR ReadString(LPCTSTR szSection, LPCTSTR szKey, LPCTSTR szDefaultValue);private: TCHAR m_szFileName[255];};#endif //INIREADER_H 2. IniReader.cpp文件: #include "IniReader.h"#include iostream#include windows.hCIniReader::CIniReader(LPCTSTR szFileName){ memset(m_szFileName, 0x00, sizeof(m_szFileName)); memcpy(m_szFileName, szFileName, ……

    28小时55分钟前回答

    利用C/C++二进制读写png文件的方法示例

    前言 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 对二进制文件的操作也需要先打开文件,用完后要关闭文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。 需求 最近为了弄OpenGl的纹理代码,发现书上没有图片像素的获取,然后就想写个来获取png的,结果花了一天的时间没弄清楚为什么出现数据个别正……