Ahmed Asakra
Ahmed Asakra

Reputation: 21

How do I convert the reading from ifstream to vector<T>

I have this code that babbles a parameter from ifstream but I want it to take from vector instead:

    void WriteBucket(std::ifstream &input_file, uint64_t bucket_size, size_t bucket_number) {
    std::vector<double> numbers;
    for (size_t i = 0; i < bucket_size && input_file; ++i) {
        double current_number;
        input_file >> current_number;
        if (input_file) {
            numbers.push_back(current_number);
        }
    }

    sort(numbers.begin(), numbers.end());
    std::ofstream output_file("intermediate_output_" + std::to_string(bucket_number));
    for (double number: numbers) {
        output_file << number << std::endl;
    }
}

I've tried to make it take from vector and type T but the result doesn't work in the end: Is it possible to convert the reading from "ifstream" to "vector" in a better way?

    template<typename T>
static void WriteBucket(vector<T> &data, uint64_t bucket_size, size_t bucket_number) {

    std::vector<T> numbers;
    //   for (auto i = 0; i < bucket_size && !data.empty(); ++i) {
    for (size_t i = 0; i < bucket_size; ++i) {
        T current_number;
        current_number = data[i];
        if (!data.empty()) {
            numbers.push_back(current_number);
        }
    }
    sort(numbers.begin(), numbers.end());
    std::ofstream zwischen_ausgabe("intermediate_output_" + std::to_string(bucket_number));
    for (auto i = 0; i < numbers.size() - 1; ++i) {
        zwischen_ausgabe << numbers[i] << std::endl;
    }

}

Upvotes: 0

Views: 132

Answers (1)

ChrisMM
ChrisMM

Reputation: 10102

Yes, you can replace the declaration of numbers and the first for loop with:

std::vector<T> numbers = data; 
if ( bucket_size < data.size() ) 
    numbers.resize( bucket_size );

Or

std::vector<T> numbers( data.begin(), data.begin() + std::min( data.size(), bucket_size ) );

Upvotes: 1

Related Questions