在C ++中,我正在读取一个文件,其中的行类似于
65-82 0.015 0.655
其中第一个是字符串(由短划线或逗号分隔的数字,然后被处理)和两个浮点数。我正在使用以下代码阅读它们,[line]是一个字符数组:
std::string temp_string;
double temp_kb, temp_kt;
int res = sscanf(line, "%s %lf %lf",temp_string,&temp_kb,&temp_kt);
这会产生警告:
~/TEPInteraction.cpp:1002:76: warning: writing into constant object (argument 3) [-Wformat=]
int res = sscanf(line, "%s %lf %lf",temp_string.c_str(),&temp_kb,&temp_kt);
^
当然有道理,因为c_str()返回一个常量指针。如果没有警告,这样做的正确方法是什么?
非常感谢, 费迪南
编辑: res的值是需要进一步控制的,所以我必须简单地重写我的代码,以便它不使用它。这不是什么大不了的事,但它会等到明天。谢谢你们:-)非常感谢你的帮助。
答案 0 :(得分:4)
由于您的输入是以空格分隔的,因此您可以使用文件流的>>
运算符读取输入。
std::ifstream fin("my_file_to_read");
std::string data;
double a, b;
fin >> data >> a >> b;
以上将采取
65-82 0.015 0.655
从文件中输入65-82
到data
然后在空格处停止。然后0.015
被添加到a
,然后停留在该空格,然后0.655
被添加到b
。
如果您想确保每行有3个值,则输入以数字开头,那么您需要使用std::getline
从文件中读取整行。然后,您可以将该行加载到std::stringstream
并检查提取是否成功。
std::ifstream fin("my_file_to_read");
std::string data, line;
double a, b;
std::getline(fin, line);
std::stringstream ss(line);
if (!(ss >> data >> a >> b))
{
//error handling code here
}
答案 1 :(得分:1)
在C ++中,您通常会执行以下操作:
std::istringstream stream(line);
std::string temp_string;
double temp_kb, temp_kt;
if (!(stream >> temp_string >> temp_kb >> temp_kt)) {
// unable to read all values. handle error here
}
你不能写那样的字符串对象。如果你真的想要使用sscanf()
,那么你需要使用char[]
数组,之后可能会将其转换为string
。