c++从文件中以string数组的形式读取信息(可以读取到每一个元素)
程序员文章站
2022-05-11 21:01:48
...
大一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号同学的信息已经被删除了: