【发布时间】:2017-03-04 03:27:45
【问题描述】:
我有一个程序可以从文件或键盘读取输入。我找到了一种方法来决定是从文件还是从键盘插入输入。
我需要用一种简单的方法来实现这个决定,因为我不想为每种类型的输入复制我的代码 2 次。
我尝试了类似下面的代码,但仅适用于输入文件 (arv == 1),而它从标准输入获得分段错误。
arg == 0 调试后出错
(_IO_fgets (buf=0xbffffaac "\030\031\023", n=100, fp=0x0) at iofgets.c:52)
代码:
FILE *fp;
if (arg = 1)
fp = fopen (operationfile, "r");
else
fp = stdin;
while (fgets(buffer, sizeof(buffer), fp) != NULL)
有没有快速的方法来做到这一点?
【问题讨论】:
-
当你的函数调用有可能失败时,总是检查它们的返回值。
fopen()等 I/O 功能特别容易出现故障;很少有不适合检查它们的返回值的情况。在这种情况下,您可能在错误情况下检测到您无法打开文件,而不是得到一个神秘的段错误。 -
您最好编写代码,以便对标准输入和命名文件使用相同的代码。将读取代码放入传递文件流的函数中通常是合适的(可能还有文件名,以防它需要生成错误消息)。这使您可以更轻松地概括您的代码。
-
当有命令行参数时 main() 的签名是:
int main( int argc, char *argv[] )在 C 中,argc参数永远不会小于 1。因为argv[0]是一个指向字符的指针包含path/name的字符串,用于程序可执行文件。要拥有单个命令行参数,argc的值将为 2,并且该参数将在argv[1]处作为指向 char 字符串的指针提供。 -
这一行:
if (arg = 1)是编译器无法捕获的常见按键错误。但是,如果文字在左侧,如if ( 1 = arg),那么编译器会捕捉到它,并且调试会容易得多。