提供与参数相同的文件在 C++ 中给出不同的输出
Giving the same file as argument gives different output in c++
我正在做nand2tetris课程的project 6,就是创建一个汇编程序。在我名为 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]);
我接受输入的方式有什么问题?如何解决? TIY
<
是输入重定向字符,由 shell 而不是您的程序处理。
如果您在第二次调用中检查参数,您会发现没有任何参数。
这意味着当您使用 argv[argc - 1]
时,您使用的是 argv[0]
,它是可执行程序。
在使用 argv
数组之前,您必须检查 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";
}
}
我正在做nand2tetris课程的project 6,就是创建一个汇编程序。在我名为 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]);
我接受输入的方式有什么问题?如何解决? TIY
<
是输入重定向字符,由 shell 而不是您的程序处理。
如果您在第二次调用中检查参数,您会发现没有任何参数。
这意味着当您使用 argv[argc - 1]
时,您使用的是 argv[0]
,它是可执行程序。
在使用 argv
数组之前,您必须检查 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";
}
}