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

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

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

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

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

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

# 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号同学的信息已经被删除了:

发布了37 篇原创文章 · 获赞 12 · 访问量 9276

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/88857572