C++txtファイルを読み込み、構造体の操作を書き込みます。
以下の通りです
wang 18 001
リ19 002
zhao 20 003
コードは以下の通りです
C言語C++2つのバージョンtxtファイルは構造体情報を読み取り、構造体ポインタに書き込み、構造体ポインタの形でtxtファイルの行数が不明であることを返します。
追加機能:直接挿入ソート方法を採用して、総成績によって降順に並べ替えました。
1、構造体の情報は以下の通りです。
txtファイルの行数を取得します。
考え方: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ファイルを読み、構造体に書き込む操作は小編集で皆さんに共有した内容です。参考にしていただければと思います。よろしくお願いします。