C - 读取作为命令行参数传递的文件

时间:2018-02-06 03:11:04

标签: c readfile

我是C编码的新手,我正在开展一个项目。有一个问题我无法解决。我试图计算给定文本文件中的单词(作为参数传递),但每次我得到结果"文件都无法打开"

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

  FILE *fptr;
  char ch;
  int w = 0;

  /* char filename[15];
  printf("Enter the filename to be opened \n");
  scanf("%s", filename);
  open the file for reading
  fptr = fopen(filename, "r"); */

  /* argc must be 2 for correct execution */
  if (argc != 2) {
    /* Assume that argv[0] is the program name */
    printf("usage: %s, <file_name>", argv[0]);
    return 0;
  }

  fptr = fopen(argv[1], "r");
  if (fptr == NULL) {
    printf("can't open file");
  }
  else {
    ch = fgetc(fptr);
    while (ch != EOF) {
      if (ch == ' ' || ch == '\n') {
        w++;
      }
      ch = fgetc(fptr);
    }
    printf("\nWords in a file are=%d", w);
    printf("\n");
  }
  fclose(fptr);
}

输出应该是文件中的单词数,但每次我尝试它我得到的结果都不能打开文件

./CountWords  test.txt
Can't open file

当我尝试通过要求用户输入文件名来改变时(就像我在评论中所做的那样,我只是想知道错误在哪里)它起作用,我得到了单词的数量。但这对我没有帮助,因为我正在研究需要计算作为命令行参数传递的文件中的单词数的项目。

char filename[15];
    printf("Enter the filename to be opened \n");
      scanf("%s", filename);
    open the file for reading 
    fptr = fopen(filename, "r");

这意味着代码可以工作,但问题仅在于读取作为命令行参数传递的文件。我搜索了类似的问题并尝试了他们的解决方案,我从其他教程编写了一个现有代码,将文件作为命令行参数读取,但问题是相同的。

我使用的是Linux,我尝试在不同的路径中使用不同的文件,但问题并未解决。

4 个答案:

答案 0 :(得分:1)

有一种更有条理的方式来编写代码,这将有助于您进行调试。

FILE* fp = fopen(argv[1],"r");
if(fp == NULL){
   perror("fopen");
   exit(EXIT_FAILURE);
}

在大多数库实现中,errno变量在失败时也设置为 系统特定的错误代码 ,这可能对此有很大的帮助情况下。

评论您的备用代码: - (检查scanf的返回值,这有助于获取输入的状态。)

if(scanf("%14s",filename)!=1){
   //error occured
}

答案 1 :(得分:1)

虽然检查if (argc != 2)并处理if块内的所有内容没有任何问题,但您可以添加从给定文件名读取的灵活性(或默认情况下来自stdin没有给出文件名)使用简单的三元运算符检查argc的值,然后打开文件或将stdin分配给文件指针。 (代码假设文件未打开,是由于文件名无效而不是stdin不可读)

此外,如果您检查并且文件未打开,而不是将所有内容都嵌套在if中,那么此时您可以returnexit。这样就可以将代码的其余部分写在if块之外。

一个简短的例子。

int main (int argc, char **argv) {

    /* use ternary operator to open file given as argv[1] or read stdin */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* do your stuff here */

    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    return 0;
}

无论哪种方式,要么检查所需的参数,要么使用三元组默认为从stdin读取都没问题,只要您确认有一个文件可供阅读。这只是添加到C工具箱的灵活性。

答案 2 :(得分:0)

我通过为fptr分配初始值找到了问题的解决方案 FILE * fptr = Null

答案 3 :(得分:-2)

我遇到了同样的问题,但是找到了解决方案。我在文件名中包含.txt,这是为什么找不到文件的原因。