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

时间:2014-02-09 17:57:23

标签: c++ arrays function

我是C ++的新手,最近我在阅读文件时遇到了麻烦。这个问题现在已经解决了。我现在要做的是使用我读取的文件来创建一个数组,但所有这一切都必须在一个函数中完成,这意味着该函数必须返回一个数组,以便我可以在main上使用它。我遵循的流程:

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

    #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
    
  5. 我认为这应该打印(使用imprimeArreglo(a)): 9 8 22 33 76 0 23 100 -8 45 但我在控制台中唯一得到的是: 2292592我认为这是一个记忆地址???我究竟做错了什么?有没有更好的方法没有使用向量? 提前谢谢!

3 个答案:

答案 0 :(得分:3)

这是一种简单的方法:

#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,例如在初始化std::advance(it, 1);后调用it

答案 1 :(得分:2)

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

int *arr = new int[tam];

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

答案 2 :(得分:0)

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

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]来调用它。

再次感谢大家!