【问题标题】:For Loop creating sequential name txt fileFor循环创建顺序名称txt文件
【发布时间】:2019-09-10 07:33:43
【问题描述】:

我想在 Linux 作为 OS 下的 for 循环中创建 N 个文件; 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  FILE *ptr;
  char name[25];

for (int i = 0; i < 10; i++) {
    snprintf(name, sizeof(name), "File_Nr%d.txt", i);
    ptr = fopen(name, "w");
    if( ptr == NULL ){
    perror("Error creating file!");
    }

    fclose(ptr);
}

return 0;
}

它工作并创建 File_Nr0.txt 到 File_Nr9.txt。

问题:这段代码“安全”吗?

【问题讨论】:

  • 只是一个问题,也许有比我能做的更好的事情! :)
  • 那么在这种情况下,如果出现问题,您可能会返回错误,并且可以考虑使用"w+""a""a+" 进行打开模式以避免截断已存在的文件
  • 还可以考虑在问题中包含您对安全性的说明
  • @DDBE,考虑在codereview.stackexchange.com提出这个问题

标签: c file pointers


【解决方案1】:

也许你只想创建文件,你可以直接使用open()系统调用,它有更多的选项和更易读的方式表达选项IMO。

int fd = open(name, O_WRONLY|O_CREAT|O_TRUNC,
         S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH); 
or
int fd = creat(name, 0644) // consider it to be an alias for above.

如果你想在文件已经存在时失败,

int fd = open(name, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644);

fopen() 中,您可以使用mode 参数中的'x' 来实现。

ptr = fopen(name, "wx");

正如@xception 提到的,当出现问题时,您应该返回一个非零错误代码。

if (NULL == ptr) {
  perror("...");
  return -1; // or better the errno which was set by open() call..
}

在您的代码中,即使在失败的情况下,您也会尝试关闭 ptr,这会让您崩溃。所以,你需要处理它。

【讨论】:

  • 我的错:'x' 作为 fopen()mode 参数的一部分由 C11 7.21.5.3 描述。
猜你喜欢
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多