TL; DR
•1。为什么代码在启动时会出现崩溃错误?
•2。argv[]
做什么?它收到你的cmd输入吗?它如何区别于argv
1,2,3 ......等等?
•3。当我用argv[1]
更改VSF.txt
时,输出未显示预期的内容
以下代码给出了错误:
File: minkernel\crts\ucrt\src\appcrt\stdio\fopen.cpp
Line: 30
Expression file_name != null_ptr
我们的想法是打印每个文件行的相应编号。我还没有完全理解文件,我相信argv[1]
是你在编译器提示符下写的,是吗?它如何区分argv 1,2,3 ...等等?
如果我用argv[1]
(文件名)改变VSF.txt
它会显示奇怪的字符(不是VSF.txt
里面的内容)
输出只显示一行,没有空格和行变量不递增;为什么不打印VSF.txt
的内容?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(int argc, char *argv[])
{
FILE *file = stdout;
int lines = 1, start = 1;
char ch;
if ((file = fopen(argv[1], "r")) == NULL)
{
printf("Impossivel de abrir o arquivo :%s", argv[1]);
exit(0);
}
while (ch = fgetc(file) != EOF)
{
if (ch == '\n')
{
lines++;
start = 1;
}
else if (start == 1)
{
printf("%d: ",lines);
putchar(ch);
start = 0;
}
putchar(ch);
}
fclose(file);
}
奇怪输出的问题在这里:
while (ch = fgetc(file) != EOF)
不等式运算符!=
的优先级高于赋值运算符=
。所以上面的表达式与:
while (ch = (fgetc(file) != EOF))
这为ch
赋予了一个布尔值,0或1.这就是你获得输出的原因。将括号放在适当的位置:
while ((ch = (fgetc(file)) != EOF)
至于崩溃,这种情况正在发生,因为你没有告诉程序你运行它时想要打开的文件的名称。如果从命令提示符运行它,请执行以下操作:
archives VSF.txt
如果从Visual Studio内部运行它,请转到项目设置,然后在Debugging set Command Arguments to VSF.txt下。