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

read and extract informations from file c++

我正在尝试为 c++ 编译器 (codeblocks) 不断向我显示的错误找到解决方案,我在网上搜索了答案,但 none 似乎有帮助。 我有一个 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
    }
}

如果有人想问有关代码的任何问题以使其更清楚,请问,我在等待您的回答和问题:)

编辑后,我能够阅读一些代码,但我仍然建议使用下面的示例,因为我看到了可怕的东西,比如 EOF inside a loop!

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


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

#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

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

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

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

你不能在这里使用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 是 return 的符号常量。按原样,您也可以编写 0;。如果您期望这会结束您的程序,那您就错了。

      ;

分号结束if

      else

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

         const string ligne1;

如果你声明了一个字符串const,你就不能给它赋值。此外,即使 else 是正确的,那个分号也会结束 else,因为你没有添加大括号(你应该 always 这样做,即使单行块,否则很容易出错)。

代码继续的方式,我很怀疑这是你的意图。 (一些缩进规则使得这种错误 确实 很容易被发现。)

         while((!fich1.eof())

How to read until EOF from cin.

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

做一些适当的缩进,好吗?此外,此时还没有声明i

         getline(fich1,l1);

我假设 l1 是您之前声明为 ligne1 的字符串。 (因为那件事发生在 else 内,ligne1 不再在范围内,但我会让那个通过,因为你显然希望 while 位于 else 内块。)

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

             else if(j == i)

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

             {   fich1>>s;

我非常怀疑 const ifstream 是否存在 operator>>(),所以我对您在这里出现错误并不感到惊讶。

                 z=(float)s;

您正在尝试将 cast(C 风格,也是...)一个 stringstream objectfloat ?您期望结果是什么?它肯定 而不是 3.14 或您写入 test.txt...

的任何内容
               }
}

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


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