读取文件并动态创建整数数组

时间:2013-10-24 15:27:26

标签: c++ arrays

这似乎是一件容易的事,但到目前为止,我所尝试的一切都没有奏效。

我有一个文件foo.txt

3
3 4 2

现在我想读取这个文件,读取第一行并实例化一个int数组,其大小与第一行读取的数字相同。 然后它应该用第二行中的元素填充该数组,第二行中的元素具有完全相同的元素数量,并在第一行中注明。

4 个答案:

答案 0 :(得分:2)

如果我们要为您提供示例代码,请向您展示最佳方法:

std::ifstream datafile("foo.txt");

if (!datafile) {
    std::cerr << "Could not open \'foo.txt\', make sure it is in the correct directory." << std::endl;
    exit(-1);
}

int num_entries;
// this tests whether the number was gotten successfully
if (!(datafile >> num_entries)) {
    std::cerr << "The first item in the file must be the number of entries." << std::endl;
    exit(-1);
}

// here we range check the input... never trust that information from the user is reasonable!
if (num_entries < 0) {
    std::cerr << "Number of entries cannot be negative." << std::endl;
    exit(-2);
}

// here we allocate an array of the requested size.
// vector will take care of freeing the memory when we're done with it (the vector goes out of scope)
std::vector<int> ints(num_entries);
for( int i = 0; i < num_entries; ++i )
    // again, we'll check if there was any problem reading the numbers
    if (!(datafile >> ints[i])) {
        std::cerr << "Error reading entry #" << i << std::endl;
        exit(-3);
    }
}

演示(由于我无法在ideone上提供正确名称的文件,因此进行了少量更改):http://ideone.com/0vzPPN

答案 1 :(得分:0)

您需要像使用cin一样使用ifstream对象

ifstream fin("foo.txt"); //open the file
if(!fin.fail()){
    int count;
    fin>>count; //read the count
    int *Arr = new int[count];

    for(int i=0;i<count;i++){ //read numbers
        fin>>Arr[i];
    }
    //... do what you need ...

    //... and finally ... 
    delete [] Arr;
} 

答案 2 :(得分:0)

如果您使用input filestream打开文件,则只需执行此操作:

std::ifstream file_txt("file.txt");

int number_count = 0;
file_txt >> number_count; // read '3' from first line

for (int number, i = 0; i < number_count; ++i) {
      file_txt >> number; // read other numbers
      // process number
}

文件流与其他标准流(std::cinstd::cout)一样,可以根据提供给operator>>的类型(在本例中为int)应用格式。 这适用于输入和输出。

答案 3 :(得分:0)

或者,您可以通过简单地将其加载到std::vector中来避免完全读取大小的需要:

std::ifstream fin("myfile.txt"); 
std::vector<int> vec{std::istream_iterator<int>(fin), std::istream_iterator<int>()};
fin.close();

或者,如果你不能使用C ++ 11语法:

std::ifstream fin("myfile.txt");
std::vector<int> vec;
std::copy(std::istream_iterator<int>(fin), std::istream_iterator<int>(), std::back_inserter(vec));
fin.close();