从命令行C读取文本文件

时间:2015-12-01 08:18:03

标签: c segmentation-fault text-files

如果有人可以帮我解决这个令人惊讶的障碍。我试图打开一个名为“inputfile.txt”的文本文件,我不能!我看过的每个例子都运行良好,但是当我尝试使用它时,文件返回null并且我得到了一个分段错误。 注意,这是在错误检查之前

#include <stdio.h>
int main(int argc, char *argv[])
{
    FILE *inputPtr;
    inputPtr = fopen(argv[2], "r");
    fclose(inputPtr);
}

当我第一次在桌面上创建文本文件时,我意识到我“略微”了一下,我把它命名为“inputfile.txt”,但它被保存为“inputfile.txt.txt”,就像那样奇怪! / p>

2 个答案:

答案 0 :(得分:1)

第一个大问题是你没有检查argc的值。此值设置为传递给程序的参数数。默认情况下,argc至少为1,因为总是传递1个参数。如果你传递任何额外的参数,argc必须大于1.在你的情况下,我猜它应该是2。 第二个问题来自第一个问题。 C中数组元素的编号从0开始,所以如果你的程序接受argc个参数,argv保持参数将有argc元素,但是!最后一个元素的索引为argc-1。默认情况下,如果没有传递其他参数,只存在argv[0]并且它是程序的名称,它也总是被传递,因此argc始终至少为1.

在您的情况下,如果argc==2,则argv [2]根本不存在,只有argv[0]argv[1]存在。当你将一个参数传递给程序时,它将被保存在argv [1]中。这意味着此行inputPtr = fopen(argv[2], "r");应更改为此inputPtr = fopen(argv[1], "r");。还应该在程序开始时检查argc。

这样的东西
int main(int argc, char *argv[])
{
  if(argc!=2)
  {
    printf("Wrong number of arguments\n");
    return -1;
  }
.....
}

答案 1 :(得分:0)

访问argv[0]之外的任何内容(始终可用)

代码必须检查argc的值以确保命令行参数实际存在。

请注意;在C中,数组索引从0开始(数组条目数-1)。

因此,如果argc为2,则只有一个命令行参数,并且:

  1. argv[0]是执行程序名称
  2. argv[1]是第一个参数。
  3. argv[2]是一个NULL指针。
  4. 所以使用argv[2]访问地址0并将导致

    1. 未定义的行为
    2. 导致seg故障事件