通过引用传递的std :: vector不是从函数传递给main()

时间:2014-11-09 03:44:34

标签: c++ function c++11 vector

此问题与此处发布的其他一些问题非常相似,但是,当我实施以前建议的解决方案时,它似乎不起作用。我正在编写一些简单的软件,可用于从函数中的.txt文件中读取一列或多列数据,并将其传递给主程序以进行进一步计算。函数调用将文件名传递给函数并读入数据。由于这个版本只读入一列数据,我可以使用这个特定示例的返回函数,但我计划扩展它以读取多列数据,这就是我使用void函数的原因。测试数据列如下所示。

103.816  
43.984  
2214.5    
321.5     
615.8     
8.186    
37.6 

函数Read_File中的for循环从文件中完整地读回数据,表明函数正常工作并正确读入数据。但是,当我尝试在主程序中使用相同的for循环显示相同的数据时,我得到一个EXEC_BAD_ACCESS错误。要清楚程序编译正常,但它没有将数据传递给主程序,这表明指针有问题。我哪里错了?任何帮助将不胜感激。

#include <vector>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <iterator>

class Read_Columnar_File {
public:
    void Read_File(const std::string& file_name,std::vector<float>& Column1);
};

#include <iostream>
int main(int argc, const char * argv[]) {

    int i;
    std::vector<float> Column2;
    Read_Columnar_File File1;

    char str[20];
    std::strcpy(str,"Test.txt");

    File1.Read_File(str,Column2);

    std::cout << std::endl;
   for(i = 0; i < 7; i++) std::cout << Column2[i];
}   

void Read_Columnar_File::Read_File(const std::string& file_name,std::vector<float>& Column1)
{
    int i;
    std::ifstream inp(file_name,std::ios::in | std::ios::binary);
    if(inp.is_open()) {
    std::istream_iterator<float> start((inp)), end;
    std::vector<float> Column1(start,end);
    for(i=0; i < 7; i++) std::cout << Column1[i] << std::endl;
    }
    else std::cout << "Cannot Open " << file_name << std::endl;
    inp.close();
}

2 个答案:

答案 0 :(得分:1)

您在函数

中声明了一个局部变量std::vector<float> Column1(start,end);

正在为局部变量分配值,因此不会更新实际矢量。

答案 1 :(得分:0)

这将解决问题。 column1在本地声明。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

class Read_Columnar_File {
public:
    void Read_File(const std::string& file_name, std::vector<float>& Column1);
};

int main(int argc, const char * argv[]) {

    int i;
    std::vector<float> Column2;
    Read_Columnar_File File1;

    char str[20];
    std::strcpy(str, "Test.txt");

    File1.Read_File(str, Column2);

    std::cout << std::endl;
    for (i = 0; i < 7; i++) std::cout << Column2[i];
}

void Read_Columnar_File::Read_File(const std::string& file_name, std::vector<float>& Column1)
{
    int i;
    std::ifstream inp(file_name, std::ios::in | std::ios::binary);
    if (inp.is_open()) {
        std::istream_iterator<float> start((inp)), end;
        Column1.assign(start, end);
        for (i = 0; i < 7; i++) std::cout << Column1[i] << std::endl;
    }
    else std::cout << "Cannot Open " << file_name << std::endl;
    inp.close();
}