【问题标题】:Is there a way to automatically name an output dat file in C?有没有办法在 C 中自动命名输出 dat 文件?
【发布时间】:2021-01-05 10:24:53
【问题描述】:

我对编程很陌生,我需要一些关于如何使用 C 自动命名文件的建议。因为我需要在集群计算机上多次运行相同的源代码。为了防止覆盖同一输出文件,我必须让每个输出文件具有不同的名称。

void RecordNumber()
{
  srand(time(NULL));
  FILE* fopen(), * fp;
  char name[64];
  int x, y;
  long num[256];
  int na = rand();

  sprintf(name, "num[%d].dat", na);
  if (first_num) {
    first_num = 0;
    fp = fopen(name, "w");
  }
  else
    fp = fopen(name, "a");
  
  for (x = 0; x <= species; ++x)
    num[x] = 0;
  
  for (x = 1; x <= xfield; ++x)
    for (y = 1; y <= yfield; ++y)
      ++num[state[x][y]];
  
  fprintf(fp, "\n%d", thetime);
  
  for (x = 0; x < species; ++x)
    fprintf(fp, "\t%d", num[x]);
 
  fclose(fp);
}

我写了一个int“na”来存储一个随机数,但是随机数没有显示在文件名中(文件名还是“dat”)。

void RecordNumber() 存储在库中。在我的一个代码中,我使用 void Report(){} 调用 RecordNumber(0) 函数来记录模拟中的所有数字


void Report()

 {

for (int j=j=thetime;j<=10000;j=j+1)
      {
          if (j%100==0)
       {EchoTime(0);
       CountSpecies(0);
           RecordNumber(0);
       }
           else
               break;
       }
      
}

我希望文件名看起来像“dat_%d”,我该怎么办?

【问题讨论】:

  • 此代码应按命名创建文件。创建的文件的确切名称是什么?如果你打印name,你会得到什么?此外,在文件名中使用方括号也不是一个好主意,因为它们可能会被 shell 使用。考虑改用下划线,即num_%d.dat
  • 我重新格式化了您的代码,使其可读。不过它应该可以工作。
  • 哦:这是什么:FILE* fopen(), * fp;??应该是FILE* fp;
  • 另外你需要检查fopen是否成功,如果没有,你需要打印错误信息并中止程序。
  • void RecordNumber() 是 C++,或者来自 1987 年。使用 void RecordNumber(void)

标签: c file fopen file-rename void-pointers


【解决方案1】:

我运行了这段修改后的代码,它运行良好,因此您的代码的其他部分可能出现故障。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void RecordNumber()
{
    srand ( time(NULL) );
    FILE *fp;
    char name[64];
    int x,y;
    long num[256];
    int na=rand();

    sprintf(name,"num[%d].dat",na);
    fp = fopen(name,"w");
    // fp = fopen(name,"a");
    fclose(fp);
 }

int main(){
    RecordNumber();
    return 0;
}

每次运行此代码时,我都会得到随机文件名,例如:
'num[1087620761].dat'     // 文件名中包含单引号
'num[1518719602].dat'

【讨论】:

  • 非常感谢您的帮助!你得到什么文件名?还是 num.dat 吗?
  • @MargaretYang 他写道,这段代码有效。但是应该告诉我们,当您将printf("opening file %s\n", name); 放在每个fopen 之前时,实际名称是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2023-03-17
  • 2023-03-19
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多