Sorting 打开一个txt文件两次c++;

Sorting 打开一个txt文件两次c++;,sorting,c++11,io,Sorting,C++11,Io,在我的程序中,我试图读取一个数字文件。我想取第一个数字,并使该数字成为我数组的大小。关闭文件后,我想重新打开同一个文件,并将其余的数字存储到数组中。在数组中,我想使用冒泡排序算法对数字进行排序,并按升序显示数组 int readData(int * arr); void bsort(int * arr, int last); void writeToConsole(int * arr, int last); void swap(int, int); int main() { ifstrea

在我的程序中,我试图读取一个数字文件。我想取第一个数字,并使该数字成为我数组的大小。关闭文件后,我想重新打开同一个文件,并将其余的数字存储到数组中。在数组中,我想使用冒泡排序算法对数字进行排序,并按升序显示数组

int readData(int * arr);
void bsort(int * arr, int last);
void writeToConsole(int * arr, int last);
void swap(int, int);
int main()
{
   ifstream inFile("data.txt");
   int arrSize;
   inFile >> arrSize;
   int * arr = new int[arrSize];
   inFile.close();
   readData(arr);
   writeToConsole(arr, arrSize);
   system("pause");
   return 0;
}
int readData(int * arr)
{
   ifstream read("data.txt");
   int index = 0;
   for(int i = 0; i < 10; i++)
   {
       read >> *(arr + index);
       index++;
   }
   read.close();
   return *arr;
}
void bsort(int * arr, int last)
{
    for (int i = last - 1; i >= 0; i--)
    {
        for (int j = 1; j <= i; j++)
        {
            //this block is constant with respect to array size
            if (*(arr + (j - 1)) > *(arr + j))
            {
                int temp = *(arr + (j - 1));
                *(arr + (j - 1)) = *(arr + j);
                *(arr + j) = temp;
            }
        }
    }
}
void writeToConsole(int * arr, int last)
{
    bsort(arr, last);
    for (int i = 0; i < last; i++)
    {
        cout << *(arr + i) << " ";
    }
}
void swap(int x, int  y)
{
    int temp = x;
    x = y;
    y = temp;
}

它可以读取文件,读取大小,然后关闭,然后再次打开,跳过大小,然后读取内容。但这是一件奇怪的事。大多数人会打开文件,读取大小,为数据分配空间,读取数据,然后关闭文件

在C语言中,在读取一个文件的数据块之前,知道它的大小通常是很方便的。在C++中,它不像STD::向量类为你扩展,做所有的FIDLE内存重新分配在幕后。
在所有的事情都顺利的时候,C++中的提取和插入操作符的使用比C版本稍微容易一些。当他们出错时,更难理解出了什么问题。一般来说,我建议新手使用fopen和fgets()逐行读取文件。这样,您就不会因为缺少或跳过字符而感到困惑。函数sScScf()将把ASCII字符串转换为一个数字,但是也可以在调试时打印出该行,以确定正在发生的事情。

< P>,建议使用C++语言和标准库的所有潜力,毕竟您使用的是C++而不是C语言。有很多方法可以做你想做的事。取决于文件中存储的数据的格式。但在所有情况下,标准库都为您提供了过多的功能和实用程序,以避免重新发明轮子,并将重点放在实际问题上。在我的例子中,我为这个特殊的I/O案例提出了这个解决方案。最后,我的强烈建议是:查看文档,尝试找到一些可以使您的工作更简单的东西

#包括
使用名称空间std;
矢量读取数据(常量字符串文件名){
ifstream inf(文件名);
istream_迭代器eoi,输入(inf);
向量arr(*input++);//取第一个整数,即大小,并推进迭代器
复制(输入、eoi、arr.begin());
返回arr;
}
void b排序(矢量和数据){
//按需要对数据进行排序
排序(data.begin(),data.end());
}
无效写入控制台(矢量和数据){
//做你的事
复制(data.begin()、data.end()、ostream_迭代器(cout,“”);
}
内部主(空){
字符串文件_name=“data.txt”;
自动数据=读取数据(文件名);
b分类(数据);
将_写入_控制台(数据);
返回0;
}

关于如何分配空间然后读取数据的提示?我正在考虑创建另一个指针变量,但我认为这不是很有效。非常感谢您的建议。谢谢
9

8

4

7

2

9

5

6

1

3
#include <bits/stdc++.h>
using namespace std;

vector<int> read_data( const string file_name){

  ifstream inf(file_name);

  istream_iterator<int> eoi, input(inf);

  vector<int> arr(*input++);//take the first integer, the size, and advance the iterator

  copy(input, eoi, arr.begin());

  return arr;
}

void bsort( vector<int>& data ){
  //sort data like you want
  sort( data.begin(), data.end());
}

void write_to_console( vector<int>& data){
  //do your stuff
  copy(data.begin(), data.end(), ostream_iterator<int>(cout," "));
}

int main(void) {
  string file_name = "data.txt";

  auto data = read_data( file_name );

  bsort( data );
  write_to_console( data );

  return 0;
}