Я сделал небольшую программу, которая построчно перебирает файл. Все работало нормально с окончаниями строк UNIX:
std::ifstream file(filename);
while (std::getline(file, str))
{
std::sort(str.begin(), str.end());
std::cout << str << ""; ----- WORKS as expected
}
При использовании окончаний строк DOS std::getline не возвращает строку. Так что больше пробных ошибок заставило меня задуматься о том, что мне, вероятно, следует разграничить " ". И это работает:
std::ifstream file(filename);
while (std::getline(file, str, ' '))
{
std::cout << str << ""; -- returns a line
std::sort(str.begin(), str.end());
std::cout << str << ""; ----- does not work like the first time
}
Вторая попытка выводит строку нормально, но при вводе этой строки для сортировки она работает неожиданно. Итак, мой вопрос: почему std::sort работает по-другому во второй раз? Моя первая идея заключалась в том, что, возможно, тип переменной отличается, но это ни к чему не привело. Что мне не хватает? Можно ли заставить его работать, как в первом блоке кода?
Я не могу воспроизвести проблему. Прекрасно работает с терминаторами строк unix и CRLF на моей машине.
Если на ваш вопрос дан ответ, пожалуйста, отметьте его как «ответил», kahvelvahvel.





Вместо
std::cout << str << "";
тебе стоит попробовать
std::cout << str << std::endl;
чтобы получить новую строку должным образом во всех операционных системах.
std::cout << '\n'; — правильный способ во всех операционных системах. std::endl почти всегда перебор.
Использование std:: во многих случаях является «излишним», но это СТАНДАРТ, поэтому его имя «std» :-) .
Мой комментарий не о std . Речь идет о std::endl.
«Возможно, мне следует разграничить пробелы», не уверен, почему вы подумали, что это может быть хорошей идеей, поскольку пробелы не являются новыми строками. Ваш исходный код должен был работать с окончаниями строк unix или dos. Что вы подразумеваете под «не возвращает строку»? Что он возвращает вместо этого?