此问题与此处发布的其他一些问题非常相似,但是,当我实施以前建议的解决方案时,它似乎不起作用。我正在编写一些简单的软件,可用于从函数中的.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();
}
答案 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();
}