lundi 4 mars 2019

Compilation error with readfile function in C++

I am trying to make a C++ program which reads in a data from file with ifstream. This is the code of my program:

#include<iostream>
#include<fstream>
#include<string>
#include "sort.h"

std::vector<int> readfile(std::string &filename)
{
    // Open the file 
    std::ifstream file(filename, std::ios::binary);
    // Get the size of the file - seek to end 
    file.seekg(0, file.end);
    std::streampos size = file.tellg();
    // Seek back to start
    file.seekg(0,file.beg);
    // Number of elements is size / sizeof(int)
    int elements = size / sizeof(int);
    // Create an array of data to raead into
    int *temp = new int[elements];
    // Read in data
    file.read((char*)temp, size);
    // Close the file 
    file.close();
    //Copy data into the vector 
    std::vector<int> data(temp, temp + elements);
    // Delete the data
    delete[] temp;
    // Return the vector
    return data;
}

int main(int argc, char **argv)
{
    // Read in a vector
    std::vector<int> data = readfile(std::string("numbers.dat"));
    // Print the vector size 
    std::cout<<"Numbers read = "<<data.size() <<std::endl;
    // Sort the vector 
    sort(data);
    // Output first 100 numbers
    for(int i = 0; i < 100; i++)
    {
        std::cout<<data[i]<<std::endl;
    }
    return 0;
}

The header file sort.cpp is :

#include "sort.h"
#include<iostream>

void sort(std::vector<int> &data)
{
    // Iterate through each value
    for( int i = 0; i< data.size(); ++i)
    {
        // Loop through values above index i 
        for(int j = 0; j < data.size() - (i + 1);  ++j)
        {
           if(data[j] > data[j+1])
            {
                // Swap values 
                int temp = data[j+1];
                data[j+1] = data[j];
                data[j] = temp;
            }
        }
     if(i % 1000 == 0)
     {
     std::cout<<((float)i / (float)data.size()) * 100.0f << "% sorted" << std::endl;
     }      

  }
}

The error which I get is :

ifstream.cpp: In function ‘int main(int, char**)’: ifstream.cpp:34:40: error: cannot bind non-const lvalue reference of type ‘std::__cxx11::string& {aka std::__cxx11::basic_string&}’ to an rvalue of type ‘std::__cxx11::string {aka std::__cxx11::basic_string}’ std::vector data = readfile(std::string("numbers.dat")); ^~~~~~~~~~~~~~~~~~~~~ ifstream.cpp:6:18: note: initializing argument 1 of ‘std::vector readfile(std::__cxx11::string&)’ std::vector readfile(std::string &filename)

I was wondering why this does not work. Is it the GCC that does not like anything or it's me, the non-experienced man with the stick for the C++. Thanks in advance !

Aucun commentaire:

Enregistrer un commentaire