Строка получает мусор подряд после преобразования в c_str () - PullRequest
1 голос
/ 07 декабря 2010

Это домашнее задание, просто для всех, кто хочет знать.

Я пишу словарный переводчик (английский -> немецкий и наоборот) и должен сохранить все, что пользователь делает в файл. Достаточно просто.

Это код:

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 ]

3 голосов
/ 07 декабря 2010

функция read (как в строке file.read(buffer, length);) не обнуляет символьный буфер. Вам нужно будет сделать это вручную (выделить еще один символ и поместить nul в gcount-ю позицию после read ing).

1 голос
/ 07 декабря 2010

Я бы сделал это:

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

Избегайте необходимости в промежуточном буфере полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...