如何摆脱if-elif-else子句

时间:2017-04-30 22:34:20

标签: c++

例如,我有一些文件名数组:

char arr[N] = ["FILENAME0", "FILENAME1", "FILENAME2", "FILENAME3", "FILENAME4", ...]

如何编写依赖于N fopenfclose N个文件的函数?
switch-caseif-elif-else很简单,但需要很多条件且N已经知道(N将在运行时从stdin传递)。

For-loop不适用于此,因为它会逐步打开和关闭。我希望在开头,函数将fopen N个文件,然后所有这些N文件描述符应该在内存中可用,然后才关闭N个文件。

我希望N == 1函数的行为如下:

int func ()
{
  FILE *fp = fopen(arr[0]);
  fclose(fp);
  return 0;
}

N == 3

int func ()
{
  FILE *fp = fopen(arr[0]);
  FILE *fp1 = fopen(arr[1]);
  FILE *fp2 = fopen(arr[2]);
  fclose(fp);
  fclose(fp1);
  fclose(fp2);
  return 0;
}

2 个答案:

答案 0 :(得分:1)

只需将scope :all_but_first, -> { order(created_at: :desc)[1..-1] } 存储到FILE*中,然后使用第二个循环关闭它们:

std::vector

如果您在打开文件和关闭文件之间执行任何可能引发异常的操作,那么您可能希望使用异常安全的包装器,而不是手动关闭void func(const std::vector<std::string>>& filenames) { std::vector<FILE*> fds; for (const std::string& filename : filenames) { fds.push_back(std::fopen(filename.c_str(), "w")); } // Work with the file descriptors however you want for (FILE* fd : fds) { std::fclose(fd); } }

FILE*

答案 1 :(得分:0)

AFAIK,FILE *fp = fopen(arr[0]);上没有可能的缩短C++等解决方案。您无法使用if-elif-else子句打开文件并关闭它。

相关问题