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

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 C++文件读写操作来读取学生信息文件内容到学生数组。以下是一个示例代码: ```c++ #include <iostream> #include <fstream> #include <string> using namespace std; struct Student { string name; int age; string gender; }; int main() { const int MAX_STUDENTS = 100; Student students[MAX_STUDENTS]; int num_students = 0; ifstream infile("students.txt"); if (infile.is_open()) { string line; while (getline(infile, line)) { Student student; student.name = line; infile >> student.age >> student.gender; students[num_students++] = student; infile.ignore(); // ignore the newline character } infile.close(); } else { cout << "Unable to open file" << endl; return 1; } // print the contents of the array for (int i = 0; i < num_students; i++) { cout << students[i].name << " " << students[i].age << " " << students[i].gender << endl; } return 0; } ``` 在上面的代码,我们首先定义了一个 `Student` 结构体来存储每个学生的信息。然后我们定义了一个大小为 `MAX_STUDENTS` 的 `students` 数组来存储所有学生的信息,并用 `num_students` 变量来记录实际读取到的学生数量。 接下来,我们使用 `ifstream` 对象来打开名为 `students.txt` 的文件,并进行读取操作。在每次循环,我们首先读取一行学生姓名,并将其存储到 `student.name` 。接着,我们使用 `>>` 运算符来从文件读取学生的年龄和性别,并将它们存储到 `student.age` 和 `student.gender` 。最后,我们将 `student` 对象存储到 `students` 数组,并将 `num_students` 加 1。在每次循环结束后,我们使用 `ignore` 函数来忽略掉读取操作时留下的换行符。 最后,我们在循环外打印 `students` 数组所有学生的信息,以验证读取操作是否成功。 注意,上面的示例代码假设学生信息文件每行只包含一个学生的信息,即每行依次为学生姓名、年龄和性别。如果学生信息文件的格式不同,例如每个学生的信息分别存储在不同的行,那么需要进行相应的更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值