C++txtファイルを読み込み、構造体の操作を書き込みます。


以下の通りです
wang 18 001
リ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++2つのバージョン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
", 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ファイルを読み、構造体に書き込む操作は小編集で皆さんに共有した内容です。参考にしていただければと思います。よろしくお願いします。