读取从文件到字符串到数组的数字

时间:2014-10-23 13:52:24

标签: c++

我正在读取文件中的数字,比如说:

1 2 3 4 5

我想将这个数据从一个文件读入一个字符串中,然后再进行处理。这就是我所做的:

float *ar = nullptr;
while (getline(inFile, line))
{
    ar = new float[line.length()];
    for (unsigned int i = 0; i < line.length(); i++)
    {
          stringstream ss(line);
          ss >> ar[i];
    }
}
unsigned int arsize = sizeof(ar) / sizeof(ar[0]);
delete ar;

只需说它只能从文件中获取第一个值就可以了。如何让数组输入所有值?我调试了程序,我可以确认该行具有所有必要的值;但浮点阵不是。请帮忙,谢谢!

4 个答案:

答案 0 :(得分:2)

line.length()是该行中的字符数,而不是单词/数字/ whatevers的数量。

使用一个可以轻松调整大小的向量,而不是试图兼顾指针。

std::vector<float> ar;
std::stringstream ss(line);
float value;
while (ss >> value) {     // or (inFile >> value) if you don't care about lines
    ar.push_back(value);
}

现在可以ar.size()获取尺寸;使用sizeof不起作用,因为ar是指针,而不是数组。

答案 1 :(得分:0)

最简单的选择是使用标准库及其流。

$ cat test.data
1.2 2.4 3 4 5

鉴于该文件,您可以像这样使用流库:

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

int main(int argc, char *argv[]) {
  std::ifstream file("./test.data", std::ios::in);

  std::vector<float> res(std::istream_iterator<float>(file),
                         (std::istream_iterator<float>()));

  // and print it to the standard out
  std::copy(std::begin(res), std::end(res),
            std::ostream_iterator<float>(std::cout, "\n"));

  return 0;
}

答案 2 :(得分:0)

当我想从文件中逐行提取数据以填充我想要使用的sql数据库时,我遇到了这个问题。 这个具体问题有很多解决方案,例如:

解决方案是使用带有while语句的stringstream将数据从文件放入带有while语句的数组

<强> //修改

  1. 使用getline声明
  2. //这个解决方案并不复杂,而且非常易于使用。

    新改进的简单解决方案:

    #include <iostream>
    #include <fstream>   
    #include <string>
    #include <vector>
    using namespace std;
    
    int main()
    {       
        ifstream line;
        line.open("__FILENAME__");
        string s;
        vector<string> lines;
        while(getline(line, s)) 
        {
            lines.push_back(s);
        }
        for(int i = 0;i < lines.size();i++)
        {
            cout << lines[i] << " ";
        }
        return 0;
    }
    

    编译代码以进行检查 - http://ideone.com/kBX45a

答案 3 :(得分:-2)

atof怎么样?

std::string value = "1.5";
auto converted = atof ( value.c_str() );

相当完整:

while ( std::getline ( string ) ) 
{
   std::vector < std::string > splitted;
   boost::split ( splitted, line, boost::is_any_of ( " " ) );

   std::vector < double > values;       
   for ( auto const& str: splitted ) {
      auto value = atof ( str.c_str() );
      values.push_back ( value );
   }
}