从命令行参数打开文本文件

时间:2014-10-25 23:46:30

标签: c++ text-files command-line-arguments ifstream

我正在尝试从命令行参数中打开一个文件。

我调试了我的程序:

当我打印文件的值时,它给出值<不完整的类型>。

当我打印argv的值时,它给出了值(char **)0x7fffffffe4e0。

当我打印argv [1]的值时,它给出值0x0。

该功能无法打开我的文件。不知道为什么?

我试过了:

if (file.is_open())也是同样的问题。

在我的主要功能中,我通过了:

buildBST(&argv[1]);

BSTTreeData buildBST (char *argv[]){
  vector <string> allwords;

  BSTTreeData Data;
  BinarySearchTree<string> Tree;

  ifstream file (argv[1]);

  char token;

  string listofchars = "";
  string input;

  int distinct = 0;
  int line = 1;

  if (file){
      //if the file opens
      while (getline(file, input)) //gets every line in the file
      {
          for (int i = 0; i < input.size(); ++i) //gets all the contents in the line
          {
              token = input[i]; //each character become a 'token'
              if (isalpha(token))
              {
                  //if the character is an alphabetical character
                  listofchars += token; //append character to a string
                  if (Contains(allwords, listofchars) == false)
                  {
                  //if the current word has not already been added to vector of words
                      //increment the distinct word count
                      distinct += 1;
                      Tree.insert(listofchars); //creates the BST
                      allwords.push_back(listofchars); 
                      //add current word to vector of all the words
                  }
                  else
                  line++; //increments the line number
              }
              else
                  line++; //increments the line number
          }
          listofchars = ""; //creates empty character string
      }
    }
    file.close(); //closes file

    Data.BST = Tree;
    Data.linenumber = line;
    Data.distinctwords = distinct;
    Data.words = allwords;
    return Data;
}

1 个答案:

答案 0 :(得分:0)

回想一下,在大多数操作系统中,argv函数中的main是以下形式的数组:

argv[0]        = /* path to the program ("zeroth argument") */;
argv[1]        = /* first argument */;
argv[2]        = /* second argument */;
...
argv[argc - 1] = /* last argument */;
argv[argc]     = NULL;

这里的问题是你正在查看第二个参数,而不是第一个。当您在buildBST(&argv[1])函数中调用main时,将指针移动一个元素,以便 buildBST中的 argv现在指向第一个参数而不是第0个参数,因此argv[1]中的表达式buildBST产生第二个参数而不是第一个参数。

解决方案是:

  1. &argv[0](或等效argv)传递到buildBST,然后使用argv[1]

  2. 获取参数
  3. &argv[1](或等效地argv + 1)传递到buildBST,然后使用argv[0]获取参数。

  4. 第一种方法可能更具可读性,因为您没有改变argv的含义。