将文本文件中的信息读取到文本文件中的 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 的插入运算符:&gt;&gt;。此运算符从其输入流中读取一个以空格分隔的单词,对其进行适当的解释,并将该值分配给命名变量。例如,要读入单个 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] &lt; data[j]),那么您的交换行将类似于std::swap(data[i], data[j])

但是,您的数据结构并不典型。您有三个并行数组,它们必须作为一个集合排序,而不是三个不同的集合。在您的情况下,您的“做一些比较”行可能是 if (LastNames[i] &lt; 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 &lt stud * &gt students; [不要忘记删除指针]

3.访问姓氏为 :: students[iterator] -> last 并对字符串进行选择排序。

矢量 &lt 螺柱 * &gt ::iterator it; for(it = students.begin() ; it != students.end() ; it++) // 这是遍历学生容器的方法

【讨论】:

以上是关于将文本文件中的信息读取到文本文件中的 3 个不同数组中(c++)的主要内容,如果未能解决你的问题,请参考以下文章

如何按降序对文本文件中的不同类型数字排序到文本框?

比较从文本文件中读取的并行数组

循环将文件的每一行读取到自己的数组中[重复]

如何使用 genfromtxt() 从 NumPy 中的文本文件中读取不同长度的列?

在vb中如何一次性地将文件内容读取到文本框

如何读取文本文件并将其行添加到 Java 中的数组中?