【问题标题】:Iterating over multiple file objects迭代多个文件对象
【发布时间】:2015-10-10 08:52:54
【问题描述】:

我想遍历文件对象的列表/数组:file_x,file_y,file_z,..., 在 C 中对每个文件对象调用一个函数。

问题

如何创建一个函数,该函数将 (i) 文件对象和 (ii) 字符串作为函数的参数,然后将字符串写入该文件对象。然后,For 循环可以在文件对象的列表/数组上执行该函数。

void file_write(file_object, string_to_write){
   fprintf(file_object, "%s\n", string_to_write);
}

研究

我搜索了谷歌,观看了几个 Youtube 教程的部分内容并搜索了关于 SO 的相关问题,但以下是我能做到的最好的。任何有关如何以理想功能更好地回答上述问题的建议将不胜感激。

FILE *file_x, *file_y, *file_z, *file_vx, *file_vy

file_x  = fopen("./data/x.dat","w"); 
file_y  = fopen("./data/y.dat","w"); 
file_z  = fopen("./data/z.dat","w"); 
file_vx = fopen("./data/vx.dat","w"); 
file_vy = fopen("./vy.dat","w"); 

fprintf(file_x,  "#X(t) Coordinates\n#Time (t)\n");
fprintf(file_y,  "#Y(t) Coordinates\n#Time (t)\n");
fprintf(file_z,  "#Z(t) Coordinates\n#Time (t)\n");
fprintf(file_vx, "#X(t) Velocities\n#Time (t)\n");
fprintf(file_vy, "#Y(t) Velocities\n#Time (t)\n");

fclose(file_x);
fclose(file_y);
fclose(file_z);
fclose(file_vx);
fclose(file_vy);

【问题讨论】:

  • 这里:void file_write(file_object, string_to_write){file_object 应该是 FILE* 的数组还是单个 FILE*
  • @CoolGuy 最好是单个,但是如果您还可以解释如何在函数之外创建文件对象数组,我将不胜感激。是否可以创建文件数组?
  • 您可以尝试使用二维数组或一维数组到char* 来存储所有文件名/路径并使用索引将它们称为char *fileName[num of files] = {"path/name", ...}; 这样您就可以使用 for 循环打开它们并将打开的文件描述符存储到另一个数组中,您可以通过另一个 for 循环循环调用您的函数。
  • void file_write(FILE *file_object, const char *string_to_write)

标签: c function file


【解决方案1】:

您声明一个 FILE 指针,然后,您可以声明两个数组,一个用于文件名,一个用于要写入它们的数据。创建一个循环并像这样迭代:

int main(void)
{
    FILE *file_x;

    const char *dirs[] = { "./data/x.dat",
                           "./data/y.dat",
                           "./data/z.dat",
                           "./data/vx.dat",
                           "./vy.dat"
                         };

    const char *data[] = { "#X(t) Coordinates\n#Time (t)\n",
                           "#Y(t) Coordinates\n#Time (t)\n",
                           "#Z(t) Coordinates\n#Time (t)\n",
                           "#X(t) Velocities\n#Time (t)\n",
                           "#Y(t) Velocities\n#Time (t)\n",
                         };

    for( int n = 0 ; n < 5 ; n++ )
    {
        file_x = fopen(dirs[n],"w");

        if ( !file_x )
        {
            perror(dirs[n]);
            exit(EXIT_FAILURE);
        }
        fprintf(file_x , "%s" , data[n]);

        fclose(file_x);
    }
    return 0;
}

【讨论】:

  • 你一次只打开一个文件,处理它然后立即关闭,所以你只需要一个文件*。
  • @machine_1 感谢您的回答,但答案中显示的代码导致了段错误对其有效
  • 应该是fprintf(file_x, "%s", data[n]);。切勿在没有文字格式字符串的情况下使用 fprintf
  • 你还应该检查fopen是否成功:if (!file_x) { perror(dirs[n]); exit(EXIT_FAILURE); }
  • @hello_there_andy 将char * 更改为const char *
猜你喜欢
  • 1970-01-01
  • 2015-01-19
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2011-01-13
  • 2016-08-06
  • 1970-01-01
相关资源
最近更新 更多