这是一项家庭作业,仅供所有想知道的人使用。
我正在写一个词汇翻译器(英语->德语,反之亦然),并且应该保存用户所做的一切归档工作。很简单。
这是代码:
std::string file_name(user_name + ".reg");
std::ifstream file(file_name.c_str(), std::ios::binary | std::ios::ate);
// At this point, we have already verified the file exists. This shouldn't ever throw!
// Possible scenario: user deletes file between calls.
assert( file.is_open() );
// Get the length of the file and reset the seek.
size_t length = file.tellg();
file.seekg(0, std::ios::beg);
// Create and write to the buffer.
char *buffer = new char[length];
file.read(buffer, length);
file.close();
// Find the last comma, after which comes the current dictionary.
std::string strBuffer = buffer;
size_t position = strBuffer.find_last_of(',') + 1;
curr_dict_ = strBuffer.substr(position);
// Start the trainer; import the dictionary.
trainer_.reset( new Trainer(curr_dict_.c_str()) );
问题显然是应该存储我的字典值的curr_dict_。例如,我的老师有一个名为
10WS_PG2_P4_de_en_gefuehle.txt
的字典文件。培训师将导入字典文件的全部内容,如下所示:std::string s_word_de;
std::string s_word_en;
std::string s_discard;
std::string s_count;
int i_word;
std::ifstream in(dictionaryDescriptor);
if( in.is_open() )
{
getline(in, s_discard); // Discard first line.
while( in >> i_word &&
getline(in, s_word_de, '<') &&
getline(in, s_discard, '>') &&
getline(in, s_word_en, '(') &&
getline(in, s_count, ')') )
{
dict_.push_back(NumPair(s_word_de.c_str(), s_word_en.c_str(), Utility::lexical_cast<int, std::string>(s_count)));
}
}
else
std::cout << dictionaryDescriptor;
一行这样写
1 überglücklich <-> blissful (0)
curr_dict_似乎可以正常导入,但是在输出时,我在文件末尾得到了一堆垃圾字符!
我什至使用了十六进制编辑器来确保包含字典的文件末尾没有多余的字符。没有。
字典的最高代码正在读取注册表文件:
基督教
Christian,abc123,10WS_PG2_P4_de_en_gefuehle.txt
我究竟做错了什么?
最佳答案
我会这样做:
std::string strBuffer(length, '\0');
myread(file, &strBuffer[read], length); // guranteed to read length bytes from file into buffer
完全避免使用中间缓冲区。
关于c++ - 转换为c_str()后,字符串最终变成垃圾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4379518/