2016-07-10 8 views
-2

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

[email protected]:~/ass3/assignment3$ ./myassembler MaxL.asm >test.txt 
[email protected]:~/ass3/assignment3$ cat test.txt 
0000000000000000 
1111110000010000 
0000000000000001 
1111010011010000 
0000000000001010 
1110001100000001 
0000000000000001 
1111110000010000 
0000000000001100 
1110101010000111 
0000000000000000 
1111110000010000 
0000000000000010 
1110001100001000 
0000000000001110 
1110101010000111 

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

[email protected]:~/ass3/assignment3$ ./myassembler <MaxL.asm>test.txt 
[email protected]:~/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]); 

Что плохого в том, как я беру вход? Как это исправить? TIY

+2

@sam Мой хрустальный шар показывает, что люди определенно собираются удержать вас перед этим обещанием «только сегодня», и вам будет жаль. –

+0

Я не могу ждать завтра! Вся община собирается сделать мою работу за меня. Я буду играть в видеоигры –

+0

, что было очень полезно. Было очень интересно исправить мою собственную ошибку, и мне это удалось. Спасибо – tuxebin

ответ

2

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

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

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

Перед использованием массива необходимо проверить, есть ли argc больше 1.

Если 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"; 
    } 
} 
+0

И он не должен открывать файл дважды. Предоставление имени файла конструктору открывает файл уже. После этого ему не нужно называть 'open'. – JojOatXGME

+0

Я понял, что пошло не так. Благодаря вам. Не использовал ваш формат, но смог исправить проблему. большое спасибо – tuxebin

 Смежные вопросы

  • Нет связанных вопросов^_^