提问人: 提问时间:5/25/2021 最后编辑:Obsidian 更新时间:5/25/2021 访问量:162
如何从文件中读取数字并将其用作C++中的变量?
How to read a number from a file and use it as a variable in C++?
问:
假设我正在阅读一个文件,内容如下:
#character posX posY //commentary line: explains what it represents
CharacterName1 50.0 0.0
CharacterName2 32.0 50.0
这里的目标是能够读取 posX et posY 并在我的 C++ 程序中将它们转换为 2 个双精度变量 x 和 y。
现在,我所能做的就是开始阅读文件,看看该行是否对应于空行或注释行。 然后,如果阅读行找到相应的字符名,我应该能够继续阅读这一行以获得 posX 和 posY,但我不知道该怎么做。我不知道如何跳过空白,如何开始读取数字以及如何完成读取然后将其转换为双倍。
关于我应该怎么做的任何想法?
我真的希望这已经足够清楚了。
先谢谢你。
尝试示例
void loadMap(std::string const& filepath) {
std::ifstream infile(filepath.c_str());
if(infile.fail()) {
std::cerr << "Error... " << std::endl;
} else { /opening occured correctly
while ( !infile.eof() ) {
std::string line;
std::getline(infile, line);
if ( (line[0] != '#') or (line.empty()) ) { //if line not comment or not empty
if( line.find("CharacterName1") ) {.......
然后我迷路了。
答:
3赞
dixit_chandra
5/25/2021
#1
希望这段代码会有所帮助。
#include <bits/stdc++.h>
using namespace std; //change headers and namespaces; included for ease of use;
vector<string> split(const string &text, const char sep) {
vector<string> tokens;
std::size_t start = 0, end = 0;
while ((end = text.find(sep, start)) not_eq string::npos) {
tokens.emplace_back(text.substr(start, end - start));
start = end + 1;
}
tokens.emplace_back(text.substr(start));
return tokens;
}
int main()
{
ofstream outdata;
outdata.open("example.txt");
if( not outdata ) {
cerr << "Error: file could not be opened" << endl;
exit(1);
}
outdata<<"CharacterName1"<<','<<10.0<<','<<40.0<<endl; //writing data into file
outdata<<"CharacterName2"<<','<<20.0<<','<<30.0<<endl;
outdata<<"CharacterName3"<<','<<30.0<<','<<20.0<<endl;
outdata<<"CharacterName4"<<','<<40.0<<','<<10.0<<endl;
outdata.close();
ifstream inputFile;
inputFile.open("example.txt",fstream::in);
if (inputFile.fail())
{
cerr<<"Error: file could not be opened"<<endl;
exit(1);
}
string line;
vector<string> col1;
vector<double> col2;
vector<double> col3;
while (getline(inputFile, line))
{
if(not line.empty()){
auto lineData = split(line, ','); //separator can change in your case
col1.emplace_back(lineData[0]);
col2.emplace_back(std::stof(lineData[1]));
col3.emplace_back(std::stof(lineData[2]));
}
}
for(int i =0; i<(int) col1.size();i++) //printing the data;
cout<<col1[i]<<"\t"<<col2[i]<<"\t"<<col3[i]<<"\n";
return 0;
}
通过以下方法理解上述逻辑:
读取文件的每一行。
对于每一行,我们将通过函数分离列数据,该函数将返回该行的包含数据。这是文件中使用的分隔符;当我使输入文件以逗号分隔时,我使用了
split(string, sep)
vector<string>
sep
','
将返回的类型 row-data 转换为适当的数据类型并存储在相应的列向量中。
vector<string>
col1, col2, col3
对 split() 功能的引用。
对于可能缺少某些数据的另一列 您可以添加一些逻辑,例如
if(lineData.size() > 3)
col4.emplace_back(std::stof(lineData[3]));
else
col4.emplace_back(0.0);
在行之后。col3.emplace_back(std::stof(lineData[2]));
评论
3赞
Bathsheba
5/25/2021
你可能花了一段时间才写出来。为什么不用充分的解释来完成答案呢?我还会删除前两行 - 您不会经常在生产代码中看到它们。
0赞
Konrad Rudolph
5/25/2021
我从未见过有人毫无讽刺意味地使用.你真的认为这比?not_eq
!=
0赞
dixit_chandra
5/25/2021
@Bathsheba 我正在等待帖子所有者的确认,以确定它是否是所需的解决方案,以便我可以帮助提供更好的解释。
1赞
dixit_chandra
5/25/2021
@Bathsheba一定要帮我 😜
1赞
Bathsheba
5/25/2021
@dixit_chandra:谢谢。反对票转换为赞成票!
评论
while (!stream.eof()))
被认为是错误的?