【问题标题】:Creating a new file in loop which coniatns the number of loop in C在循环中创建一个新文件,该文件包含 C 中的循环数
【发布时间】:2015-10-13 14:11:02
【问题描述】:

我想在循环上运行一个函数,并且我想将输出存储在不同的文件中,这样文件名就包含循环变量。你能告诉我吗?例如如下:

for(i==1;i==N;i++) 

    fp = fopen ("file_(NUMBER OF LOOP(I)).txt", "w+");

【问题讨论】:

  • 如果您保留c++ 标签,您可能会使用该语言获得答案。如果您想要c 语言答案,只需删除c++ 标记。
  • 查看sprintf函数。

标签: c


【解决方案1】:

首先:

for(i==1;i==N;i++) 

在两个层面上是不正确的。首先,您还没有在其他任何地方声明 i,所以它是一个未定义的“东西”,而不是 int i = 1; 我想您希望它是。其次,进行比较 i == N 同时让 i 增加但 N 不增加将确保您的循环只会运行一次,从而无需开始循环。

已更正,您的循环语句将如下所示:

for(int i = 1; i < somevalue; i++)

只是通过连接名称前缀、i 转换为字符串和 .txt 后缀来构建一个字符串,然后将该字符串作为第一个参数调用 fopen。

【讨论】:

  • 经典案例是i = 1和i &lt;= n或i = 0和i &lt; n
  • 如果你使用i = 1你有事先声明了int i。比较运算符完全取决于他想用for循环做什么。
【解决方案2】:

首先:你的循环全错了。使用上面编写的代码,您正在测试是否 i==1,而不是将 i 设置为 1。然后您继续循环的条件是 i==N,这意味着它只会 如果这是真的,请继续。您的目标大概是:

for(int i=1; i<=N; i++)

这将运行 N 次,i 的值从 1 到 N,包括 1 到 N。

一种方法是使用 C 库中的 sprintf。

这需要您创建一个 char 数组,然后由 sprintf 填充该数组。它将数组作为第一个参数,然后是您要填充的字符串。您可以在字符串中放置指示要包含的变量类型的标记,并将这些变量添加为后续参数。

例如:

int x=5;
char buffer[50];
sprintf(buffer,"file%d.txt",x);

sprintf 行执行后,变量buffer 将保存“file5.txt”。

如果您将 sprintf 行放在循环中,那么您当然可以使用循环索引来获得所需的内容。

更完整的 sprintf 使用教程请见here。

【讨论】:

  • ii++ 先生,您确定需要 2x 我吗?
  • @Magisch 我确实没有(固定)。
【解决方案3】:

没有比这更容易的了:

for (long long int i = 0; i < N; ++i) {
    std::string filename("file_");
    filename += std::to_string(i) + ".txt";
    std::ofstream f(filename.c_str(), std::ios_base::out | std::ios_base::ate);
}

【讨论】:

    【解决方案4】:

    所以你想要:

    file_0.txt

    file_1.txt

    等等……对吧?

    您需要将文件名“file_i.txt”作为字符串。为此,您基本上是将整数 i 转换为字符串,然后连接迭代的字符串,使用“file_”+“i's value”+“.txt”作为文件名,并将该变量传递给最后一行已发布。

    因此,您需要将 int 转换为字符串是您问题的主要症结所在。 :)

    http://www.cplusplus.com/articles/D9j2Nwbp/ 或者 Easiest way to convert int to string in C++

    【讨论】:

      【解决方案5】:

      您需要通过调用snprintf 和适当的格式字符串来格式化文件名。下面是一个带有错误处理的最小示例。

      #include <stdlib.h>
      #include <stdio.h>
      
      int main(void)
      {
          int N = 100;
          const int buf_size = 20;
          char buf[buf_size];
      
          for (int i = 0; i < N; ++i) {
              int ret = snprintf(buf, buf_size, "file_%d.txt", i);
              if (ret < 0 || ret >= buf_size) {
                  fprintf(stderr, "snprintf: error at iteration %d: return value was %d\n", i, ret);
                  exit(1);
              }
      
              FILE *fp = fopen(buf, "w+");
              if (fp == NULL) {
                  perror("couldn't open file for writing");
                  continue;
              }
              /* 
               * do your stuff here 
               */
              fclose(fp);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 2023-03-05
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多