从文件中读取和提取信息 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
内块。)
无论如何,这是行不通的,因为您的 ifstream
和 string
都是不变的,即无法更改。这没有意义,因此没有为 const
参数定义 getline()
。
else if(j == i)
由于您没有关闭 上面if
语句的大括号,这也是一个语法错误。同样,适当的缩进规则会使这一点立即显而易见。
{ fich1>>s;
我非常怀疑 const ifstream
是否存在 operator>>()
,所以我对您在这里出现错误并不感到惊讶。
z=(float)s;
您正在尝试将 cast(C 风格,也是...)一个 stringstream
object 到 float
数?您期望结果是什么?它肯定 而不是 是 3.14
或您写入 test.txt
...
的任何内容
}
}
忘记戴牙套了。这段代码是 FUBAR,我什至没有检查它是否有意义 语义 一旦所有错误都被修复,我怀疑你在这里玩一些精心设计的巨魔恶作剧。如果不是这种情况,我建议你再好好看看你用来学习 C++ 的教科书,因为你有很多地方都错了。
纯粹与样式相关的建议:fich1
、ligne1
...不要使用本地化(非英语)标识符。在交流您的代码时,它只会增加另一个问题。 (这是来自非英语母语者。)
我正在尝试为 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
内块。)
无论如何,这是行不通的,因为您的 ifstream
和 string
都是不变的,即无法更改。这没有意义,因此没有为 const
参数定义 getline()
。
else if(j == i)
由于您没有关闭 上面if
语句的大括号,这也是一个语法错误。同样,适当的缩进规则会使这一点立即显而易见。
{ fich1>>s;
我非常怀疑 const ifstream
是否存在 operator>>()
,所以我对您在这里出现错误并不感到惊讶。
z=(float)s;
您正在尝试将 cast(C 风格,也是...)一个 stringstream
object 到 float
数?您期望结果是什么?它肯定 而不是 是 3.14
或您写入 test.txt
...
}
}
忘记戴牙套了。这段代码是 FUBAR,我什至没有检查它是否有意义 语义 一旦所有错误都被修复,我怀疑你在这里玩一些精心设计的巨魔恶作剧。如果不是这种情况,我建议你再好好看看你用来学习 C++ 的教科书,因为你有很多地方都错了。
纯粹与样式相关的建议:fich1
、ligne1
...不要使用本地化(非英语)标识符。在交流您的代码时,它只会增加另一个问题。 (这是来自非英语母语者。)