LINUX.ORG.RU

С++ неожиданный результат выдаёт.

 


0

3

Вот весь код программы:

#include <iostream>
#include <fstream>
#include <string>

bool exists(std::string path)
{
        std::ifstream f(path);
        std::cout << path << ": " << f.good() << std::endl;
        return f.good();
}

int main()
{
        std::ifstream f("settings.txt");
        std::string name, path;
        std::getline(f, name);
        std::getline(f, path);
        std::cout << "path = " << path << std::endl;
        std::cout << "path/run = " << (path + "run") << std::endl;
        std::string pathrun = path + "run";
        std::cout << "prun = " << pathrun << std::endl;
        exists(pathrun);
        return 0;
}

А вот её вывод:

path = /mnt/
runh/run = /mnt/
runn = /mnt/
run: 0

Вижу, что со строками какой-то ужас, но не могу понять, что я сделал не так.

★★★★★

Последнее исправление: monk (всего исправлений: 2)

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
monk ★★★★★
() автор топика

Компилировал

g++ test.cpp
g++ -O3 test.cpp

результат одинаков

monk ★★★★★
() автор топика

Нашёл необходимое условие для глюка: строки в settings.txt должны быть в dos-кодировке. Но всё равно не понимаю, почему это UB…

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

строки в settings.txt должны быть в dos-кодировке

А какая разница, если там ланиница. Или ты имеешь в виду \r\n? Вангую, что \r как раз даёт этот эффект при выводе.

no-such-file ★★★★★
()

предположу, что в файле строка завершается \r\n, а std::getline читает до \n. При выводе \r возвращает каретку в начало

xgatron
()
Ответ на: комментарий от Crocodoom

Действительно. Исправил.

monk ★★★★★
() автор топика

Ошибка студенческого уровня :) Предпочитаю делать strip строки, прежде чем ее кушать. А то может там корявая лапа пробелы насыпала, а может даже tab, и текстовый редактор это может не показать

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Так файл другой программой формируется. Она раньше под cygwin была. Теперь под MSVC из-за того, что VTK перестал под cygwin компилироваться (тоже феерия: под Linux работает, под MSVC тоже, а под Cygwin ошибка линковки «не найден символ»).

Про то, что ошибка глупая, согласен. Но обстановка располагала: полночь, Хэллоуин… вот и полез на форум вместо того, чтобы досконально разобраться.

P.S. Хороший вопрос для собеседования получился:

$ cat test.cpp
#include <iostream>
#include <fstream>
#include <string>

int main()
{
        std::ifstream f("test.txt");
        std::string str;
        std::getline(f, str);
        std::cout << "str = " << str << std::endl;
        std::cout << (str + "world!") << std::endl;
        return 0;
}
$ cat test.txt
Hello
$ g++ test.cpp
$ ./a.out
str = Hello
world!
monk ★★★★★
() автор топика
Ответ на: комментарий от monk

P.S. Хороший вопрос для собеседования получился:

Для собеседования на должность младшего специалиста по терминалам с тяжёлым наследием семидесятых годов прошлого века?

im-0
()
Ответ на: комментарий от monk

Хороший вопрос для собеседования получился

Какое собеседование - такой корпоративный хелловорлдуин

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

очередной ментор пришел дать оценку происходящему, уверен что ты делаешь подобные ошибки постоянно.

anonymous
()
Ответ на: комментарий от im-0

с тяжёлым наследием семидесятых годов прошлого века

Как изящно слово «Linux» переведено. :-)

monk ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.