我有一个函数,它接受一个文件名(字符串),我希望有一个文件名(字符串)数组来检查文件名是否传入是否在数组中,如果没有添加到它。这是我到目前为止所得到的。
bool read_file(char * filename, bool warnings){
//Check to see if filename is in array files
static char * files[MAXFILES];
static int counter = 0;
for(int i=0;i<counter;i++){
if(strcmp(filename,files[i]) == 0){
fprintf(stdout, "Error\n");
return 0;
}
else{
files[counter]=filename;
counter++;
}
}
FILE * fp = fopen(filename,"r");
if(fp == NULL){
if(warnings){
fprintf(stderr, "Can't open the file %s\n",filename);
return 0;
}
else{
return 0;
}
}
else{
fclose(fp);
fp = NULL;
return 1;
}
}
由于某种原因,它不会将文件名添加到文件[]任何帮助将被批准。
答案 0 :(得分:1)
第一次看看你的循环(i == 0
和counter == 0
时):
static int counter = 0;
for(int i = 0; i < counter; i++) {
// this never runs
}
i < counter
始终为false,因为counter
在for循环的主体中递增。
你需要重新思考你的逻辑。这个功能正在做很多事情。也许像这样循环的东西会有所帮助:
if (counter == 0) {
// first time in the function, just add the filename
files[counter]=filename;
counter++;
}
else {
for (int i = 0; i < counter; i++) {
...
}
}
但是,您可能会将此分成几个函数。一个用于向数组添加文件名,另一个用于检查文件是否已存在,第三个用于打开文件等。
答案 1 :(得分:1)
查看此循环的else
子句:
for(int i=0;i<counter;i++){
if(strcmp(filename,files[i]) == 0){
fprintf(stdout, "Error\n");
return 0;
}
else{
files[counter]=filename;
counter++;
}
}
只有当您知道文件不在列表中时才想将文件添加到列表中,并且在完成整个列表之前您不会知道该文件。所以,该代码应该看起来像:
for (int i = 0; i < counter; i++)
{
if (strcmp(filename, files[i]) == 0)
{
fprintf(stdout, "Duplicate file %s found at %d\n", filename, i);
return 0;
}
}
files[counter++] = filename;
请注意比“错误”更好的错误消息。你需要知道出了什么问题,因为这不会是程序中唯一可能出错的地方。您可以辩论这个数字是否有用;这个名字当然是,但拥有索引号也可能对你有帮助。
答案 2 :(得分:1)
您的else
放错了地方。这样:
for(int i=0;i<counter;i++){
if(strcmp(filename,files[i]) == 0){
fprintf(stdout, "Error\n");
return 0;
}
else{
files[counter]=filename;
counter++;
}
}
永远不会被输入,如果是,它会一直认为该文件在列表中,因为您在完成检查之前将其附加。然后你会找到你附加的那个,并认为它已经存在。
相反,等到你检查完整个列表后再添加文件名:
for(int i=0;i<counter;i++){
if(strcmp(filename,files[i]) == 0){
fprintf(stdout, "Error\n");
return 0;
}
}
files[counter]=filename;
counter++;
关键是return 0
重定向流出函数,而不是else子句。你知道,只要循环结束,你仍然处于文件名不存在的函数中。
答案 3 :(得分:0)
将您的for循环更改为
for (i=0;i<=counter;i++)