我是C ++的新手,最近我在阅读文件时遇到了麻烦。这个问题现在已经解决了。我现在要做的是使用我读取的文件来创建一个数组,但所有这一切都必须在一个函数中完成,这意味着该函数必须返回一个数组,以便我可以在main上使用它。我遵循的流程:
在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
我认为这应该打印(使用imprimeArreglo(a)):
9 8 22 33 76 0 23 100 -8 45
但我在控制台中唯一得到的是:
2292592
我认为这是一个记忆地址???我究竟做错了什么?有没有更好的方法没有使用向量?
提前谢谢!
答案 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]
来调用它。
再次感谢大家!