C++ 中 readfile 函数的编译错误
Compilation error with readfile function in C++
我正在尝试制作一个 C++ 程序,它使用 ifstream 从文件中读取数据。这是我的程序代码:
#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;
}
头文件 sort.cpp 是:
#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;
}
}
}
我得到的错误是:
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<char>&}’ to an rvalue of type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’
std::vector<int> data = readfile(std::string("numbers.dat"));
^~~~~~~~~~~~~~~~~~~~~
ifstream.cpp:6:18: note: initializing argument 1 of ‘std::vector<int> readfile(std::__cxx11::string&)’
std::vector<int> readfile(std::string &filename)
我想知道为什么这不起作用。是 GCC 不喜欢任何东西,还是我这个没有经验的人坚持 C++。提前致谢!
函数参数中缺少关键字 const。这个错误的原因是,C++ 不希望用户更改临时变量的值,因为它们可以随时从内存中删除。这样做是为了避免临时变量被传递然后导致问题的问题。
函数定义可以改成:
std::vector<int> readfile(const std::string &filename)
我认为是 readfile 函数定义中的引用导致了问题。如果您从函数声明和定义的参数中删除引用,则代码编译得很好。
std::vector<int> readfile(std::string filename)
我正在尝试制作一个 C++ 程序,它使用 ifstream 从文件中读取数据。这是我的程序代码:
#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;
}
头文件 sort.cpp 是:
#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;
}
}
}
我得到的错误是:
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<char>&}’ to an rvalue of type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’
std::vector<int> data = readfile(std::string("numbers.dat"));
^~~~~~~~~~~~~~~~~~~~~
ifstream.cpp:6:18: note: initializing argument 1 of ‘std::vector<int> readfile(std::__cxx11::string&)’
std::vector<int> readfile(std::string &filename)
我想知道为什么这不起作用。是 GCC 不喜欢任何东西,还是我这个没有经验的人坚持 C++。提前致谢!
函数参数中缺少关键字 const。这个错误的原因是,C++ 不希望用户更改临时变量的值,因为它们可以随时从内存中删除。这样做是为了避免临时变量被传递然后导致问题的问题。 函数定义可以改成:
std::vector<int> readfile(const std::string &filename)
我认为是 readfile 函数定义中的引用导致了问题。如果您从函数声明和定义的参数中删除引用,则代码编译得很好。
std::vector<int> readfile(std::string filename)