我有一个文本文件,其中包含如下所示的键和值:
keyOne=1
keyTwo=734
keyThree=22.3
keyFour=5
键只是小写和大写字母,就像我的例子中一样。值可以是整数或浮点数。每个键和值由等号(=)分隔。现在我想将值读入我程序中的变量。
这是我尝试读取值的代码: (我省略了将值存储在程序变量中的部分,现在只需将它们打印出来进行演示。)
std::fstream file(optionsFile, std::fstream::in);
if (file.good()) {
int begin;
int end;
std::string line;
while(std::getline(file, line)) {
// find the position of the value in the line
for (unsigned int i = 0; i < line.length(); i++) {
if (line.at(i) == '=') {
begin = i + 1;
end = line.length();
break;
}
}
// build the string... it starts at <begin> and ends at <end>
const char *string = "";
for (int i = begin; i < end; i++) {
string += line.at(i);
}
// only gibberish is printed in the following line :(
std::cout << "string=" << string << std::endl;
}
}
我不明白为什么它不打印价值..而只是奇怪的东西,甚至没有打印
请帮助我这么难打破我的精神:(
答案 0 :(得分:1)
你正在使用没有正确分配内存的C风格字符串(字符串数组),而你只是使用指针进行操作,因此你不会在字符串中附加字符:
// build the string... it starts at <begin> and ends at <end>
const char *string = "";
for (int i = begin; i < end; i++) {
string += line.at(i);
}
改为使用std::string
:
/// build the string... it starts at <begin> and ends at <end>
std::string str;
for (int i = begin; i < end; i++) {
str += line.at(i);
}
或者手动分配内存,使用正确的索引,使用'\ 0'字符终止字符串,不要忘记在不再需要后删除字符串:
char *string = new char[end - begin + 1];
int j = 0;
for (int i = begin; i < end; i++) {
string[j++] = line.at(i);
}
// Don't forget to end the string!
string[j] = '\0';
// Don't forget to delete string afterwards!
delete [] string;
所以,只需使用std::string
。
修改为什么首先要混用C字符串和std::string
?
答案 1 :(得分:1)
如前所述,c / c ++中的本机字符串类型不支持简单连接,因为它们实际上是指向某些预分配内存的指针。当字符串应该是可变的时,你应该总是使用std :: string。
顺便说一句,请考虑以下重构:
void process_option (const std::string& a_key, const std::string& a_value)
{
std::cout << a_key << " <-- " << a_value << std::endl;
}
void read_options (std::istream& a_in, const char* a_source)
{
int line_n = 0;
std::string line;
while (std::getline(a_in, line))
{
++ line_n;
std::string::size_type p = line. find('=');
if (p == line. npos)
{
// invalid_entry(a_source, line_n);
continue;
}
process_option(
line. substr(0, p), // key
line. substr(p + 1, line. find_first_of("\t\r\n", p + 1)) // value
);
}
}
void read_options (const char* a_filename)
{
std::ifstream file(a_filename);
if (! file)
{
// read_error(a_filename);
return;
}
read_options(file, a_filename);
file. close();
}
void read_options (const std::string& a_filename)
{
read_options(a_filename. c_str());
}