我正在尝试从命令行参数中打开一个文件。
我调试了我的程序:
当我打印文件的值时,它给出值<不完整的类型>。
当我打印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;
}
答案 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
产生第二个参数而不是第一个参数。
解决方案是:
将&argv[0]
(或等效argv
)传递到buildBST
,然后使用argv[1]
或
将&argv[1]
(或等效地argv + 1
)传递到buildBST
,然后使用argv[0]
获取参数。
第一种方法可能更具可读性,因为您没有改变argv
的含义。