想要在istream C ++的行尾读取重要的双值

时间:2014-02-24 14:48:55

标签: c++ io ifstream

我正在尝试读取从文本文件中计算出的有限元代码的大矩阵。矩阵在空间上依赖,因此我需要能够方便地组织数据。计算矩阵值的外部源足以将以下行放在文本文件的顶部

No. activity levels :    3
No. pitch-angles    :   90
No. energies        :   11
No. L-shells        :   10

这基本上告诉我矩阵的位置数量。我希望能够轻松地选择这些值,因为它允许我预先分配矩阵的大小,以及立即知道我需要为此文本文件未给出的值插入多少内容。我试图用以下代码

来做到这一点
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
using namespace std;

int main(){

  string diffusionTensorFileName = "BAS_drift_averaged_chorus_kp.txt";
  string sline;
  int alphaSize=0;
  ifstream diffusionTensorFile(diffusionTensorFileName.c_str());
  while(getline(diffusionTensorFile,sline)){

    if(strncmp(sline.c_str(),"No. pitch-angles    :   90",sline.size()-1)==0 && sline.size()-1 != 0){
      alphaSize = atoi(sline.c_str());
      printf("alphaSize %d \n", alphaSize);
      vector<double> alpha(alphaSize);
    }

  }

} 

atoi当然不能很好地工作,我似乎也无法使用strtod或任何其他功能。有什么想法吗?我也对这是完全错误的做法以及如何继续提出建议。

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用流语言环境中充满scan_is方面的std::ctype方法。它的工作是搜索与给定分类匹配的第一个字符并返回指向它的指针。我们将获取该调用的结果并使用std::stoi(C ++ 11)将其解析为整数。

std::locale loc(diffusionTensorFile.getloc());
auto& f = std::use_facet<std::ctype<char>>(loc);

while (std::getline(diffusionTensorFile, sline))
{
    const char* begin = sline.front(),
                end   = sline.back() + 1;

    const char* result;
    if ((result = f.scan_is(f.digit, begin, end)) != end)
    {
        alphaSize = std::stoi(result);
        // do something with alphaSize
    }
}

Live Demo