读取文件,然后创建数组函数C++

Read File then Create Array Function C++

本文关键字:数组 函数 C++ 创建 然后 文件 读取      更新时间:2023-10-16

我是C++新手,最近我在读取文件时遇到问题。该问题现已修复。我现在想做的是使用我读取的文件创建一个数组,但所有这些都必须在函数中完成,这意味着该函数必须返回一个数组,以便我可以在 main 上使用它。我遵循的过程:

  1. 读取文件
  2. 创建阵列
  3. 返回阵列地址。
  4. 主要:使用函数将数组放入变量中。到目前为止我的代码:

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <string>
    using namespace std;
    void imprimeArreglo (int[],int);
    int* leeArreglo(string&);
    int i;
    void imprimeArreglo(int a[])
    {
        cout << a[i] << endl;
    }
    int* leeArreglo(string nombre)
    {
        ifstream arch(nombre.c_str());
        string tamStr;
        int tam;
        if(arch.is_open())
        {
             getline(arch,tamStr); 
             tam=atoi(tamStr.c_str());
             int arr[tam];
             for(int i=0;i<tam;i++)
             {
                 arch >> arr[i];
             }
             int *ret=arr;
             return ret;
         }
         return 0;
    }
    int main()
    {
         string nombre = "arr.txt";  
         int *a= leeArreglo(nombre.c_str());
         imprimeArreglo(a);
         return 0;
    }
    

    我的arr.txt文件是什么样子的:

    10
    9 8 22 33 76 0 23 100 -8 45
    

我认为这应该打印(带有imprimeArreglo(a)): 9 8 22 33 76 0 23 100 -8 45但我在控制台中得到的唯一内容是: 2292592 我认为这是一个记忆地址???我做错了什么?有没有更好的方法可以在不使用向量的情况下做到这一点?
提前感谢!

这将是一种简单的方法:

#include <iterator>
#include <vector>
#include <fstream>
std::vector<int> fileContents(const std::string& filename)
{
  ifstream inputFile(filename.c_ctr());
  std::istream_iterator<int> end;
  std::istream_iterator<int> it(inputFile);
  return std::vector<int>(it, end);
}

这会将所有数字读入向量。您可能需要修改它以忽略第一个10,例如在初始化it后立即调用std::advance(it, 1);

您正在返回对局部变量的引用。当你的函数超出范围时,数组arr被释放,因此地址返回只是垃圾。如果要返回调用函数后仍然存在的地址,请执行以下操作:

int *arr = new int[tam];

然后,在调用函数后,地址将有效,但就设计而言,这不是很好,因为您将释放数组的责任留给了调用方。我会亲自将所有这些包装在一个类中,并拥有它的数组成员。

好的,经过一些研究和咨询,我得到了答案!谢谢大家:)帮助我。这是使事情发生的代码(使用数组!!

int* readArray(string name)
{
    ifstream fil(name.c_str());
    string sizeStr;
    int size;
    if(fil.is_open())
    {
        getline(fil,sizeStr); 
        size=atoi(sizeStr.c_str());
        int* arr = new int[size+1];
        for(int i=1;i<size+1;i++)
        {
            fil >> arr[i];
        }
        //We stash the size in the first position ;)
        arr[0]=size;
        //cout << arr[0]<< "n";
        //We point to the position of the array + 1. (The 0 pos is used for the size)
        int *ret=arr+1;
        return ret;
        delete[] ret;
    }
    else cout << "ERROR...!n";
    return 0;
}

如您所见,我的函数返回一个指针。我删除了它。(仍然需要看看该delete[]是否定位良好。另外,由于我返回的是一个指针,因此我无法真正知道我的数组的大小正在使用sizeof(arr)/sizeof(int).所以我所做的是将其保存到数组的位置,这样我就可以随时使用 array[-1] 调用它。

再次感谢大家!