欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++从文件中以string数组的形式读取信息(可以读取到每一个元素)

程序员文章站 2022-05-11 21:01:48
...

大一c++程序设计课设中,我做的是学生成绩管理系统,其中就涉及到从文件中读取学生信息。《c++程序设计基础》中关于读取 文件信息的介绍少之又少,而当时的要求是需要把文件中的学生信息以一个string数组的形式读取出来,也就是说,读取来的元素可以定位到每一行每一列的具体元素,并可以对其进行删除、修改。我当时对文件的操作思路主要是:把文件中学生的信息用string数组的形式读取出来,然后在string数组中对其进行增删减除,最后将修改的新string数组写入文件,或许以后应该有更高级的做法,但目前对于技术有限的c++初学者可能就是这样。

我在文件中的学生信息顺序如下:学号、名字、性别、数学成绩、英语成绩、计算机成绩,平均成绩,文件保存在f盘,名字如下图。

下边是我创建文件时的情况:(虽然是.dat文件但我用.txt的形式打开)(后边六个零是因为我是用当时的代码来创建的文件,以输入六个间隔的零来结束写入的操作,并不碍事)

c++从文件中以string数组的形式读取信息(可以读取到每一个元素)

 

我打算以删除其中第一行的学生信息为例子,做简单的介绍:

以下是代码,解释在代码后边:(注释中最重要的关键我用*******标记)

# include <iostream>
# include <string>
# include <sstream>                  //string类型和int类型等相互转换所需的头文件:stringstream流,详细见我以前的博文
# include <fstream>                  //读取文件操作所需的头文件
using namespace std;
int main()
{
	cout << "要删除学生信息的学号:" << endl;
	int delete_number;               //定义要删除学生信息的学号  
	cin >> delete_number;
	int i, j = 0, k = 0,m=0;
	string c;
	stringstream sstream;            //这块具体内容请看我以前的博文关于string类型和int的转换
	sstream << delete_number;
	sstream >> c;                   //将int类变成string类,以用于后来的比较
	sstream.clear();                //清除stringstream流中的内容
	ifstream fcin("f://student control system.dat");                    //打开文件
	char line[1024]{0};            //line一维数组 用来读取文件中的每一行学生信息
	string b[7];                   //用来以string类型暂存每一行的学生的信息
	string a[100][7],new_a[100][7];                  //记a是从文件中读取的string 数组,new_a为删除后新的string数组
	while (fcin.getline(line, sizeof(line))) {       //读入一整行的内容存入line数组中
		stringstream word(line);                     //将line拷贝给stringstream对象word中
		for (i = 0; i < 7; i++) {
			word >> b[i];          //*********关键:word会自动识别空格逐步将值传递给b[i];
			a[j][i] = b[i];        //   将这一整行的学生信息传递给二位string数组a保存       
		}
		j++;                      //将a二维数组换行
	}
	i = 0;
	while (a[i][0] != c)          //查找直到找到为止
	{
		m++; i++;                //i和m值一样
	}

	for (i = 0; i <= (m - 1); i++)      //一直循环到要删除那一行的前一行,并将这些内容赋值给new_a
	{
		for (int k = 0; k < 7; k++)
		{
			new_a[i][k] = a[i][k];

		}
	}
	for (i = i + 1; i < j; i++)       //跳过要删除的那一行,对new_a进行赋值,这样就new_a中就没有要删除那一行的学生信息内容
	{
		for (int k = 0; k < 7; k++)
		{
			new_a[i - 1][k] = a[i][k];
		}
	}
	ofstream fcout("f://student control system.dat");   //将删除后的new_a  string数组重新写入文件
	for (i = 0; i <= (j - 2); i++)
	{
		for (int k = 0; k < 7; k++)
		{
			fcout << new_a[i][k] << "\t";
		}
		fcout << endl;
	}
	fcout.close();
	system("pause");
	return 0;
}

这是删除之后那个文件的情况,显然1号同学的信息已经被删除了:

c++从文件中以string数组的形式读取信息(可以读取到每一个元素)