字符串在转换为c_str()后结束垃圾

时间:2010-12-07 17:16:50

标签: c++ file file-io

这是一项家庭作业,仅供所有想知道的人使用。

我正在写一个词汇翻译器(英语 - >德语,反之亦然),我应该保存用户所做的一切。很简单。

这是代码:

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的字典文件。 Trainer导入字典文件的全部内容,如下所示:

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.reg

Christian,abc123,10WS_PG2_P4_de_en_gefuehle.txt

我做错了什么?

2 个答案:

答案 0 :(得分:3)

read函数(如行file.read(buffer, length);中所示)不会终止字符缓冲区。您需要手动执行此操作(再分配一个字符,并在gcount之后将{n}放在read位置。

答案 1 :(得分:1)

我会这样做:

std::string strBuffer(length, '\0');
myread(file, &strBuffer[read], length); // guranteed to read length bytes from file into buffer

完全避免使用中间缓冲区。