我正在尝试找到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
}
}
如果有人想询问有关代码的任何问题以使其更清晰,可以请求,我等待您的答案以及您的问题:)
答案 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}内阻止。)
无论如何,这不起作用,因为else
和ifstream
都是不变的,即无法更改。这没有意义,因此没有为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
...不要使用本地化(非英语)标识符。它只是在沟通您的代码时增加了另一个问题。 (这来自一位非英语母语人士。)