【问题标题】:read and extract informations from file c++从文件 c++ 中读取和提取信息
【发布时间】:2015-08-06 15:29:48
【问题描述】:

我正在尝试为 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
    }
}

如果有人想询问有关代码的任何问题以使其更清晰,请提出,我正在等待您的回答以及您的问题:)

【问题讨论】:

  • 正确缩进你的代码。我做了部分编辑来帮助你。
  • 这篇文章需要立即编辑!代码中混有错误!
  • 这是我将主要部分和文件 class.cpp 混合在一起的整个代码的摘录,只是为了告诉你我在哪里得到了错误!

标签: c++ iostream


【解决方案1】:

编辑后,我可以阅读一些代码,但我仍然建议使用下面的示例,因为我看到了可怕的东西,比如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

【讨论】:

  • 有必要使用vector吗?我只需要一个变量来存储数字(在我的代码中是“z”)。因为我需要将它与另一个常数进行比较,然后用下一行中的下一个数字替换 z 的内容也可以比较一下。
  • @farhawa 当然不。这只是一个例子。所以,做if(!line.empty()) z = atof(line.c_str());。希望这可以帮助! :)
  • 其实你的回答很有用非常感谢:)!
【解决方案2】:

您的ifstream 不应保持不变,因为getline 会更改ifstream

要将字符数组转换为浮点数,请使用atof(chararray)

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

【讨论】:

  • 实际上我写了 fich1.getline(l1) 总是同样的错误,可能是因为变量 l1 被声明为字符串,你说它必须是“一个长度的 char 数组足够长的线”?
  • 我只能回答您实际提出的问题。如果您写了 fich1.getline(l1),那么它应该在您的问题中,而不是在对我的回答的评论中。
  • @EthanFine:注意这里有个全局的std::getline,其实就是这里选择的函数。
  • 你是对的。我编辑了。我不知道我是怎么错过的,我做了检查以确定但显然我不够彻底。无论如何,这个问题的其他答案要好得多,所以也许我应该删除这个?
  • 您可以使用atof,但实际上您不应该使用。当整个字符串没有转换时,atof 静默失败。
【解决方案3】:

你不能在这里使用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 放在 else 块内。)

无论如何,这是行不通的,因为您的ifstream 和您的string 都是不变的,即无法更改。这没有意义,因此没有为const 参数定义getline()

             else if(j == i)

由于您没有关闭上述if 语句的大括号,这也是一个语法错误。同样,适当的缩进规则会立即使这一点变得显而易见。

             {   fich1>>s;

我非常怀疑const ifstream 是否存在operator&gt;&gt;(),所以你在这里收到错误我并不感到惊讶。

                 z=(float)s;

您正在尝试将stringstream object转换(C 风格,也...)到float 数字 ?你预计结果可能是什么?它肯定不会3.14 或任何你写到test.txt...

               }
}

忘记了你的牙套。这段代码是FUBAR,一旦所有错误都得到修复,我什至没有检查它是否有意义语义,我怀疑你在这里拉一些精心制作的巨魔恶作剧。如果不是这样,我建议你再好好看看你用来学习 C++ 的任何教科书,因为你有很多地方都错了。


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

【讨论】:

  • 非常感谢您抽出宝贵时间阅读我的代码。我是 C++ 编程的初学者,但我确信我不会因为忘记编写 main() 而犯错!但实际上这是一个完整代码的摘录,我在其中混合了主要部分和文件 class.cpp 来告诉你我在哪里得到了错误,如果你知道为什么我得到了 getline 错误以及为什么操作符
  • @farhawa:我根据您发布的代码来判断,很短,but neither self-contained nor compilable,此时您可能会说“抱歉”并发布更好的代码,但肯定不是“回答我”时很明显,您甚至都懒得完整阅读我的答案。你的错误在那里解释得很清楚。 (而且你没有在任何地方使用 ifstream::operator&lt;&lt;,你使用的是ifstream::operator&gt;&gt;我确实解释了为什么getline&gt;&gt;会失败,就在第一行。)因为阅读失败而投反对票,做得好。
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2020-12-19
  • 2015-09-08
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多