将文本文件中的信息读取到文本文件中的 3 个不同数组中(c++)
Posted
技术标签:
【中文标题】将文本文件中的信息读取到文本文件中的 3 个不同数组中(c++)【英文标题】:reading information from a text file into 3 different arrays from a text file (c++) 【发布时间】:2011-04-25 16:31:28 【问题描述】:我在使用 c++ 类的这个程序时遇到问题: 一位老师创建了具有姓氏、名字和考试成绩的学生平行数组。排列数组使得每个数组的第 n 个元素包含相关信息。编写一个程序,按学生的姓对数组进行排序(使用选择排序),这样每个数组的第 n 项仍然包含与正确人相关的数据。 例如原始数组数据如下:
拉特·伊斯梅拉 66 布朗汤姆 88 Dyrt Phil 94 Dent Stu 100
排序后:
棕色汤姆 88 Dent Stu 100 Dyrt Phil 94 拉特·伊斯梅拉 66
该计划最多可容纳 30 名学生。必须从数据文件中读取数据。数据文件的每一行将包含姓氏、空格、名字、空格和整数分数。程序必须显示排序前后的数据。
我知道我应该包含一个选择排序和交换功能,但我不知道该怎么做。这是我目前所拥有的,它不是很好
#include "stdafx.h"
#include <iomanip>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void selsort(int a[], int size)
void swap(string, &s1,string &s2)
void swap (int &i1, int &i2)
int main()
int counter=0;
ifstream inputFile;
string inputFileName;
cout<<"Enter the path and filename.";
getline(cin, inputFileName);
inputFile.open (inputFileName.c_str());
string LINE;
while (!inputFile.eof())
getline (inputFile, LINE)
cout<<LINE<<endl;
我知道我应该以单词而不是行的形式读取文件,我不知道如何根据姓氏、名字和分数将它们放入数组中,我的 selsort 和 swap 声明中使用的变量是都错了,最后我应该只使用一维数组。
【问题讨论】:
【参考方案1】:您似乎对家庭作业有多个问题。
Q1:如何存储我的数据?
首先,您需要声明数组。在 C++ 中,数组是固定大小的基本数据结构,表示一组同质数据。数组的特征在于它的类型和大小。如果T
表示某个任意类型,N
表示某个任意常量表达式,则可以声明一个名为myArray
的数组,因此:T myArray[N]
。具体来说,你可以声明这三个数组
std::string LastNames[30];
std::string FirstNames[30];
int Scores[30];
当访问这些数组的元素时,我们使用下标运算符[]
例如,
LastName[7] = "Johnson";
std::cout << Scores[23];
Q2:如何读取我的数据?
为了填充这些数组,我们使用来自std::istream
的插入运算符:>>
。此运算符从其输入流中读取一个以空格分隔的单词,对其进行适当的解释,并将该值分配给命名变量。例如,要读入单个 int,我们可以这样写:
int i;
std::cin >> i;
读取一个又一个值,直到到达文件末尾,这是一个常见的 C++ 习惯用法。在重复读入一种数据的情况下,我们使用这样的形式:
std::string name;
while(std::cin >> name)
// do something with "name"
在这种特殊情况下,我们使用称为“运算符链接”的功能为每个循环迭代读取三个值:
std::string lastName;
std::string firstName;
int score;
while(std::cin >> lastName >> firstName >> score)
此循环运行多次,直到到达文件末尾。循环的每次迭代都将下一组值分配给这些命名变量。请注意,这个循环很愚蠢,因为我们不对这些值做任何事情。我们立即用下一次迭代覆盖它们。
将数组概念与阅读输入习语相结合,我们有:
std::string LastNames[30];
std::string FirstNames[30];
int Scores[30];
std::string lastName;
std::string firstName;
int score;
int i = 0;
while(std::cin >> lastName >> firstName >> score)
LastNames[i] = lastName;
FirstNames[i] = firstName;
Scores[i] = score;
++i;
int NumberOfStudents = i;
Q3:如何对数据进行排序?
我不会为你写你的 selsort 算法,但你可能会有类似的东西:
for(int i = 0; i < NumberOfStudents; i++)
for(j = i; j < NumberOfStudents; j++)
// do some compares
// swap some data
在典型的排序中,“做一些比较”和“交换一些数据”行将在相同的数据结构上进行操作。因此,如果您的比较行类似于if (data[i] < data[j])
,那么您的交换行将类似于std::swap(data[i], data[j])
。
但是,您的数据结构并不典型。您有三个并行数组,它们必须作为一个集合排序,而不是三个不同的集合。在您的情况下,您的“做一些比较”行可能是 if (LastNames[i] < LastNames[j])
,但您的交换行必须在所有三个数组中进行相同的交换:
std::swap(LastNames[i], LastNames[j])
std::swap(FirstNames[i], FirstNames[j])
std::swap(Scores[i], Scores[j])
顺便说一句,这种额外的复杂性是您永远不应该使用并行数组的一个很好的理由——它们会让您重复自己,增加出错的机会。
我希望这个答案可以让您自己完成作业,而不会向您展示太多如何去做。不要忘记为您认为有帮助的每个答案投票,并接受解决您问题的答案(如果有的话)。
【讨论】:
【参考方案2】:类似:
vector <string> firstname, lastname;
vector <int> score;
string fn, ln;
int n;
while( inputfile >> fn >> ln >> n )
firstname.push_back( fn );
lastname.push_back( ln );
score.push_back( n );
在您了解它的实际作用之前,在任何情况下都不要使用 eof() 成员函数 - 提示:它不会预测下一次读取是否会导致文件结束。
【讨论】:
我认为如果 OP 使用单个数组而不是 3 个数组,实现起来可能会更容易。 @P.R.阅读问题标题。 嗯,是的,不幸的是它确实需要 3 个并行数组:/【参考方案3】:我不会为此 (HW que) 编写代码,但仍然可以让您大致了解用 c++ 编写代码。
1) 每个学生的数据结构。
结构螺柱 std::string 最后; std::string 优先; 整数 ;2.标记你得到的空格或按照unappersson的建议做。
您的容器将是 :: vector < stud * > students; [不要忘记删除指针]
3.访问姓氏为 :: students[iterator] -> last 并对字符串进行选择排序。
矢量 < 螺柱 * > ::iterator it; for(it = students.begin() ; it != students.end() ; it++) // 这是遍历学生容器的方法【讨论】:
以上是关于将文本文件中的信息读取到文本文件中的 3 个不同数组中(c++)的主要内容,如果未能解决你的问题,请参考以下文章