Предоставление того же файла в качестве аргумента дает различный вывод в переполнении стека

Я делаю проект 6 курса nand2tetris, который должен создать ассемблер. В моем ассемблере под названием myassembler.cpp, если я даю файл с именем MaxL.asm двумя разными способами, результат будет очень разным.
Вот если я сделаю следующее:

ebin@tux:~/ass3/assignment3$ ./myassembler  MaxL.asm >test.txt
ebin@tux:~/ass3/assignment3$ cat test.txt
0000000000000000
1111110000010000
0000000000000001
1111010011010000
0000000000001010
1110001100000001
0000000000000001
1111110000010000
0000000000001100
1110101010000111
0000000000000000
1111110000010000
0000000000000010
1110001100001000
0000000000001110
1110101010000111

Вывод правильный, и это то, что я хочу. Однако если я сделаю следующее,

ebin@tux:~/ass3/assignment3$ ./myassembler < MaxL.asm >test.txt
ebin@tux:~/ass3/assignment3$ cat test.txt
1110001100000000
111000000
111000000
111000000
1110101010000000
1110101010000000
1110101010000000
1110101010000000
1110101010000000
1110110000000000
111000000
1110101010000000
111000000
1110101010000000
111000000
111000000
111000000
1110101010000000
1110101010000000
111111000
111000000
1110101010000000
111000000
111000000
111000000
111000000
111000000
111000000
1110101010000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110101010000000
1110101010000000
111000000
111000000
1110001100000000
111000000
111000000
111000000
1110001100000000
111000000
111000000
111000000
1110111010000000
1110001100000000
1110101010000000
111000000
1110111111000000
1110101010000000
1110101010000000
1110111111000000
1110101010000000
1110101010000000

Вывод неверный. Для представления это должно работать вторым способом. Я не понимаю что не так когда ставлю < перед именем файла.

Вот фрагмент кода, который читает файл

ifstream fin(argv[argc-1]);
fin.open(argv[argc-1]);

Что плохого в том, как я принимаю информацию? Как это исправить? Тия

-1

Решение

< является символом перенаправления ввода и обрабатывается оболочкой, а не вашей программой.

Если вы проверите свои аргументы во втором вызове, вы заметите, что у вас нет никаких аргументов.

Это означает, что когда вы используете argv[argc - 1] ты используешь argv[0] которая является исполняемой программой.

Вы должны проверить, если argc больше чем 1 перед использованием argv массив.

Если argc равно 1 тогда вы должны прочитать std::cin вместо. Это очень легко, если вы поместите весь свой реальный код в отдельную функцию и передадите ей поток (по ссылке). Возможно что-то вроде

void function_that_does_actual_work(std::istream& in)
{
// Do lots of useful and important stuff...
}

int main(int argc, char* argv[])
{
if (argc == 2)
{
std::ifstream file(argv[1]);
function_that_does_actual_work(file);
}
else if (argc == 1)
{
function_that_does_actual_work(std::cin);
}
else
{
std::cout << "No file provided\n";
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]