gpt4 book ai didi

c++ - 在不使用数组的情况下对二进制文件中的数据进行排序

转载 作者:行者123 更新时间:2023-11-28 05:50:15 24 4
gpt4 key购买 nike

你好,我有一个作业要生成随机数。然后将它们写入二进制文件。之后我应该读取数据并将其打印到屏幕上。最后,我必须对数据和输出进行排序。我必须在不使用数组的情况下这样做。我能够完成前两部分。但是,我不能正确地完成最后一部分,所以我去谷歌和 youtube 寻找如何做到这一点的插图,但我运气不好。我真的很想知道我做错了什么,谢谢。

我想我应该使用递归 fseek 和转换来避免使用数组;但是,我不知道如何使用它们。

这是我的代码和输出:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>

using namespace std;

//Function prototypes
void Write_File(int num);
void Read_File(int num);
void Compare(int num);

//**********************

int main()
{
int num = 0;

cout << "Enter a positive number to generate random numbers ";
cin >> num;

Write_File(num);
Read_File(num);
Compare(num);


return 0;
}

//***************

// Functions Definitions
void Write_File(int num)
{
ofstream fout("sortfile.dat", ios::out | ios::binary | ios::beg);
int number = 0;

if (fout.is_open())
{
for (int x = 0; x < num; x++)
{
number = rand();
fout << number << endl;
}

fout.close();
}
else
{
cout << "Error, File not opened" << endl;
}
}

void Read_File(int num)
{
ifstream fin("sortfile.dat", ios::in | ios::binary | ios::beg);
int number = 0;

cout << endl << "randomly generated numbers befor sorting\n";
if (fin.is_open())//check first if open already
{
for (int i = 0; i < num; i++)
{
fin >> number;
cout << number << endl;
}


fin.close();
}
else
cout << "File not opened in read phase." << endl;
}


void Compare(int num)
{
int number = 0;
int temp = 0;
int hold = 0;
ifstream fin("sortfile.dat", ios::in | ios::binary | ios::beg);

if (fin.is_open())//check first if open already
{
for (int i = 0; i < num; i++)
{
fin >> number;
fin >> temp;
if (number > temp)
{


hold = temp;
temp = number;
number = hold;

}
else
{
ofstream fout("sortfile.dat", ios::out | ios::binary | ios::beg);
fout << number;
fout << temp;
}

ofstream fout("sortfile.dat", ios::out | ios::binary | ios::beg);
fout << number;
fout << temp;
}
cout << endl << "Nums after sort\n";
for (int i = 0; i < num; i++)
{
fin >> number;
cout << number << endl;
}

fin.close();
}
else
cout << "File not opened in read phase." << endl;
}

输出:

Enter a positive number to generate random numbers 4

randomly generated numbers befor sorting
41
18467
6334
26500

Nums after sort
6334
6334
6334
6334
Press any key to continue . . .

最佳答案

好的,这里有几处错误。首先,您将无法通过仅交换相邻元素来进行一次性排序。那将是一个 O(n) 排序,如果你设法实现它,你将立即成为计算机科学界的名人。你的教授说你不能使用数组?如果说“数组”,他/她指的是任何一种内存缓冲区,那就太傻了。如果您想要一种不使用数组的排序,从字面意义上讲,只需使用 std::map。当您从文件中读取数字时,将数字插入 map 。然后,使用迭代器按排序顺序检索数字,并打印出来。

其次,您正在使用文件 io 做一些可能不是您想要的事情。在您从文件中读取数字对然后可能交换它们的循环中,您的控制流允许将这对数字写入文件两次,前提是它们是按排序顺序排列的。此外,您在每次循环迭代中构建一个或可能两个 ofstream 对象。每个新的输出流都从文件的开头开始,因此您要重复写入文件的开头。在打印出“已排序”的内容之前,您也不会将输入流搜索到文件的开头。它打印出相同数字 4 次的原因是它已到达文件末尾,并且没有为“数字”分配任何新值。

我的建议是真正避免尝试同时读取和写入文件。读取中的数字(请注意,不是数组;)),对它们进行排序,然后输出它们。 (从作业规范来看,您似乎不必再次将它们写入文件,但我不确定)。

关于c++ - 在不使用数组的情况下对二进制文件中的数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35402849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com