【问题标题】:in C++ using visual studio how can I create 3 functions one to read a file, one to sort a file, and one to output the sorted file?在使用 Visual Studio 的 C++ 中,如何创建 3 个函数,一个用于读取文件,一个用于对文件进行排序,一个用于输出排序后的文件?
【发布时间】:2019-02-18 07:01:32
【问题描述】:

我正在尝试完成一项任务。这是一个从文本文件中读取销售数据、对数据进行排序并将排序后的数据输出到第二个文件的程序。输入文件是逗号分隔值文件 (CSV),第一项是要处理的销售数据项的数量,然后是一行销售数据的列表(项目以逗号分隔)。每个销售数据项都是十进制数。但我必须在包括 main() 在内的 4 个函数中执行此操作,这是我遇到最多问题的地方

示例输入:

5,453.67,8769.57,221.87,600.28,8123.00

我对如何在文件中读取以及如何对数据进行排序感到困惑。

int main() {
string filename, newFilename;
ifstream infile("salesData.csv");
//cout << "What file do you want to open? " << endl;
//cin >> filename;
int size = 0;

getSalesData(size, filename);
selectionSortArray(filename, size);
ofstream outputFile;
writeTofile(outputFile, filename);

system("pause");

return 0;
}


double * getSalesData(int &size, string &filename)
{
    ifstream inputfile;
    inputfile.open(filename);
    double * salesData = new double[size];
    inputfile.close();
    return salesData;

}

//******************************************************************
// selectionSortArray
// task: to sort values of an array in ascending order // data in: the array, the array size // data out: the sorted array
//******************************************************************
void selectionSortArray(string &filename, int length){}


// copy data to output file 
void writeTofile(ofstream &outputFile, string x)
{

    outputFile.open(x.c_str());


    outputFile.close();
}

我希望看到样本输入 5,453.67,8769.57,221.87,600.28,8123.00 被排序

【问题讨论】:

  • get a couple of good books to read。这应该教你所有你需要知道的关于如何从文件中读取的知识。它还应该告诉您将std::vector 用于“动态数组”。
  • 请把这个问题变成一个单一编程问题的重点问题。例如。首先在工作中阅读。问一个关于第一个严肃的、集中的编程问题的问题。然后开始工作(也许询问)关于排序的工作。然后开始工作(也许询问输出)。也许按顺序处理输入、输出、排序。
  • 我想重申一些程序员老兄所说的话。函数对于良好的编程实践至关重要且必不可少。什么是函数?函数是您期望得到的回报。 f(x) = 2x + 1。当你插入 x = 2 时会发生什么? x = 4怎么样?当你给一个函数一些东西时,你应该期待一些回报。在这种情况下,您知道您的三个函数应该做什么,但是您的输入应该是什么?
  • 为了把它变成一个输入问题。请详细说明让您感到困惑的地方。什么不起作用?可以直接读取输出吗? (即通过不尝试实际存储您阅读的内容来简化。
  • @Sailanarmo 我觉得你误解了 Somes 的意图。考虑使用“@”符号来 ping 他。

标签: c++ file sorting


【解决方案1】:

我只会处理您的主要问题。您显然在为向函数传递参数和从函数返回值的概念而苦恼。

您的getSalesData 函数很好,因为它返回了销售数据,但您错过的是您应该在main 的变量中捕获该返回值。像这样

int main() {
    ...
    int size = 0;
    double* salesData = getSalesData(size, filename);
    ...
}

double * getSalesData(int &size, string &filename)
{
    ...
    return salesData;
}

捕获返回值后,您可以将其作为参数传递给其他函数,例如

selectionSortArray(salesData, size);
writeTofile(filename, salesData, size);

请注意,您不需要将文件名传递给排序函数,我只是将文件名(而不是 ofstream)传递给了写入函数。 ofstream只在写函数中需要,不需要在main函数中声明。

你写的每一个函数,想想这个函数需要什么作为参数,它返回什么作为结果。然后只用这些东西声明那个函数。函数内部需要的变量,应该在函数本身中声明。

最后,您的代码缺少一些函数原型,通常您将它们放在代码的顶部。像这样

double * getSalesData(int &size, string &filename);
double * selectionSortArray(double* salesData, int size);
void writeTofile(string& filename, double* salesData, int size);

这避免了您可能遇到的关于未声明函数的任何错误。

【讨论】:

  • 是的,你是对的,我不擅长将参数传递给其他函数。但我想我现在把所有东西都放在一起了,除了我对你如何拥有 selectionSortArray 和 writeToFile int 我的选择排序的原型感到困惑我收到一个错误,将表单 double 转换为 int
  • 谢谢约翰帮助我,除了现在我的问题是作为一个函数写入文件,我认为我在正确的轨道上,但后来我看到了你的原型,我很好奇你如何使用这些参数
  • @CAP_BLUE 如果您有更多问题,最好向 SO 发布新问题。
猜你喜欢
  • 2021-03-05
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2020-04-14
  • 1970-01-01
相关资源
最近更新 更多