从文件c ++中读取和提取信息

时间:2015-08-06 15:29:49

标签: c++ iostream

我正在尝试找到c ++编译器(代码块)不断向我展示的错误的解决方案,我在网上搜索了答案,但它们似乎都没有帮助。 我有一个txt文件,其中有数字,每个都写在一行。 我想要的是读取每个数字(逐行)并将其从字符串转换为浮点数后存储在变量中。 这是我的代码

#include <fstream>
#include <sstream>
#include <string>
#include <iostream>

float z;   
int j=0;
stringstream s; 
const ifstream fich1; 
fich1.open("test.txt",ios::in);     
if(!fich1)
{ 
    cerr<<"could not open the file";
    EXIT_FAILURE;
};
else const string ligne1;
while((!fich1.eof())
{ 
    if(j!=i)
    {
        j++;
        getline(fich1,l1); // the first error is: no matching function for call to ‘getline(const ifstream&, const string&)
    else if(j == i)
    {   
        fich1>>s; // the second error is: ambiguous overload for ‘operator>>’ (operand types are ‘const ifstream {aka const std::basic_ifstream<char>}’ and ‘std::stringstream {aka std::basic_stringstream<char>}’)
        z=(float)s; // I couldn't find a clear answer to convert from string to float
    }
}

如果有人想询问有关代码的任何问题以使其更清晰,可以请求,我等待您的答案以及您的问题:)

3 个答案:

答案 0 :(得分:2)

编辑之后,我能够阅读一些代码,但我仍然建议我下面的例子,因为我看到了可怕的事情,比如EOF inside a loop

哦,如果你有C ++ 11支持,那么你可以使用std::stof

你可以尝试这个(因为你的帖子不可读),它逐行读取文件并将每个浮点数存储在一个向量中:

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

int main() {
  std::vector<float> v;
  std::string rec_file = "test.txt";
  std::string line;
  std::ifstream myfile(rec_file.c_str());
  if(myfile.is_open()) {
    while(std::getline(myfile,line)) {
      if(!line.empty())
        v.push_back(atof(line.c_str()));
    }
    myfile.close();
  } else {
      std::cerr << "Unable to open file";
  }
  for(unsigned int i = 0; i < v.size(); ++i)
    std::cout << v[i] << std::endl;
  return 0;
}

使用test.txt:

1.2
2.3
3.4
4.5
5.6
6.7

和输出:

1.2
2.3
3.4
4.5
5.6
6.7

答案 1 :(得分:0)

ifstream不应该保持不变,因为getline会改变ifstream

要从char数组转换为float,请使用atof(chararray)

要从字符串转换为浮点数,您可以使用atof(string.cstr())

答案 2 :(得分:-1)

你不能在这里使用const但那不是你唯一的问题。

#include <fstream>
#include <sstream>
#include <string>
#include <iostream>

看起来不错。

float z;   
int j=0;
stringstream s; 

这里应该有一些int main() {,因为这是C ++可执行文件启动时运行时调用的函数。这不是Bash或Perl,执行只是在第一个语句中找到。

您需要将using namespace std;stringstream之类的标识符作为std::stringstream编写。

const ifstream fich1; 

这不会奏效。不得将ifstream声明为const。 (这实际上是您遇到的错误的解释,但您做了更多。)

输入文件流是具有复杂内部状态的对象,例如您当前所处的文件中的位置,错误标记等;这个内心状态是正在改变,因此const ifstream根本无法工作。

fich1.open("test.txt",ios::in);     

由于const而导致此问题无效,就像您fich1上的所有其他操作一样。

if(!fich1)
      { cerr<<"could not open the file";
      EXIT_FAILURE;
     };

EXIT_FAILURE是返回的符号常量。原样,你也可以写0;。如果您希望这会结束您的计划,那么您就错了。

      ;

分号结束if

      else

由于if已结束,这是语法错误。

         const string ligne1;

如果声明字符串const,则无法分配给它。此外,即使else是正确的,该分号也会结束else,因为你没有添加大括号(因为你应该总是做,即使单行块,因为它很容易犯错误。)

代码的继续方式,我非常怀疑这是你的意图。 (一些带有缩进的学科会使这种错误真的很容易被发现。)

         while((!fich1.eof())

How to read until EOF from cin

         { if(j!=i)
             {j++;

做一些合适的缩进,好吗?此外,此时尚未宣布i

         getline(fich1,l1);

我认为l1是您之前声明为ligne1的字符串。 (由于这发生在else内,ligne1已不在范围内,但我会让那一个通过,因为您显然希望while位于{{1}内阻止。)

无论如何,这不起作用,因为elseifstream都是不变的,即无法更改。这没有意义,因此没有为string参数定义getline()

const

由于您没有关闭上面 else if(j == i) 语句的括号,这也是语法错误。再次,适当的缩进纪律会使这一点立即变得明显。

if

我非常怀疑 { fich1>>s; 存在operator>>(),因此我不会对此感到惊讶。

const ifstream

您正在尝试投射(C风格......) z=(float)s; 对象stringstream ?您期望结果如何?它肯定float或您写入3.14的任何内容......

test.txt

大括号丢失了。这段代码是FUBAR,一旦修复了所有错误,我甚至无法检查语义是否有意义,而且我怀疑你在这里扯过一些精心设计的巨魔恶作剧。如果不是这样的话,我建议你再看看你用来学习C ++的教科书,因为你有很多错误。

纯粹与风格相关的建议: } } fich1 ...不要使用本地化(非英语)标识符。它只是在沟通您的代码时增加了另一个问题。 (这来自一位非英语母语人士。)