【问题标题】:How to pass in FILE* array into function如何将 FILE* 数组传入函数
【发布时间】:2018-02-19 00:08:53
【问题描述】:

我只需要知道如何将FILE* 数组传递和声明到函数中

void openInputFiles(char* name, FILE* input[]){
    char filename[10];
    if (strcmp("average", name) == 0){
        int i;
        int k =1;
        for (i=1;i<=10;i++){
            if (i<10){
                sprintf(filename,"%s_00%d",name,k);
            }
            if (i == 10){
                sprintf(filename,"%s_0%d",name,k);
            }
            input[i-1] = fopen(filename,"r");
            k++;
        }
    }
    if (strcmp("median", name) == 0){
        int i,k;
        k=1;
        for (i=1;i<10;i++){
            sprintf(filename,"%s_00%d",name,k);
            input[i-1] = fopen(filename,"r");
            k++;
        }
    }
}

这是函数的代码,这是我试图调用它的地方

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

    FILE* input[10];

    openInputFiles(argv[1],input);
}

当我编译它时我没有收到任何警告,但是当我尝试 gdb 它来测试有什么问题时,FILE* 似乎没有将内存地址分配给input[0],因为它说它在地址 @ 987654328@。我做错了什么?

【问题讨论】:

  • 这些文件是否已经存在?
  • 是的,它们是与 sprintf 同名的文件。
  • 如果fopen返回NULL,则表示打开文件时出错,您需要检查errno以查看问题所在:linux.die.net/man/3/fopen
  • 是的,NULL 为零(我不认为这是由标准强制执行的,这里有人会知道,但对于我曾经工作过的每个系统来说都是如此)。 fopen 正在返回 0,因为打开文件时出现问题,您需要检查 errno 以找出失败的原因。并且input[10] 超出了您的数组范围,有效索引为 0 到 9。
  • @yano 常量文字0 用于检查空指针,它也是一个空指针常量。将 void* 强制转换为字面常量 0 也被视为空指针,这就是为什么 NULL 的定义通常为 #define NULL ((void*) 0)。然而,这并不意味着NULL 等于值 0,但我不知道有任何现代架构不是这种情况。见stackoverflow.com/a/1296865/1480131

标签: c arrays file pointers


【解决方案1】:
char filename[10];
...
sprintf(filename,"%s_00%d",name,k);

正如 user3121023 正确指出的那样,没有足够的空间将“average_001”放入您为文件名分配的 9 个字符(加上终止 NUL)中。您需要将其设为char filename[12]; 或更大。结果,您的程序表现出未定义的行为,这意味着任何事情都可能发生。

你也应该~永远不要使用sprintf——改用snprintf,并且总是检查错误,像这样:

if (snprintf(filename, sizeof(filename), "%s_00%d", name, k) >= sizeof(filename)) {
  abort();  // filename is too short.

您还可以简化循环(绝对不需要以不同于 i == 10 的方式处理 i == 1 到 9:

for (i = 0; i < 10; i++) {
  int n = snprintf(filename, sizeof(filename), "%s_%03d", name, i + 1);
  if (n == -1 || n >= sizeof(filename) {
    // handle format error or "filename" too short here.
  }
  input[i] = fopen(filename, "r");
  if (input[i] == NULL) {
    // handle fopen failure here.
  }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多