【问题标题】:C Program unable to create output text fileC程序无法创建输出文本文件
【发布时间】:2012-10-02 16:34:30
【问题描述】:

我的一个朋友需要在他的一个课程中使用 MATLAB,所以他打电话给我(计算机科学专业的)并问我是否可以教他 C。我熟悉 C++,所以我也熟悉通用语法,但必须阅读 C 的 IO 库。

我正在创建一些简单的 IO 程序来展示给我的朋友,但是我的第三个程序给我带来了麻烦。当我使用 Eclipse(使用 CDT)在我的机器上运行程序时,Eclipse 的控制台会产生一个有问题的输出,而不是提示我输入数据,它会获取输入,然后使用 FAILURE 一次性打印出来。

程序应该从用户那里获取一个文件名,创建文件,然后写入它,直到用户输入一个空行。

当我通过控制台 (g++ files2.c) 在我的机器上编译/运行它时,系统提示我正确输入数据,但显示失败,并且没有输出文件。

我认为错误在于我使用 char 数组的方式,因为使用 scanf 获取文件名会创建一个功能文件(可能是因为它忽略了空格),但不会进入 while 循环。

#include <stdio.h>

#define name_length 20
#define line_size 80

int main() {
  FILE * write_file;                    // pointer to file you will write to
  char filename[name_length];           // variable to hold the name of file
  char string_buffer[line_size];        // buffer to hold your text

  printf("Filename: ");                 // prompt for filename

  fgets(filename, name_length, stdin);  // get filename from user

  if (filename[name_length-1] == '\n')  // if last char in stream is newline,
    {filename[name_length-1] = '\0';}   // remove it

  write_file = fopen(filename, "w");    // create/overwrite file user named

  if (!write_file) {printf("FAILURE");} // failed to create FILE *

  // inform user how to exit
  printf("To exit, enter a blank line (no spaces)\n");

  // while getting input, print to file
  while (fgets(string_buffer, line_size, stdin) != NULL) {
    fputs(string_buffer, write_file);
    if (string_buffer[0] == '\n') {break;}
  }

  fclose(write_file);
  return 0;
}

我应该如何修复程序?我几乎没有发现用户终止的输入被写入文件。

现在请原谅我,我有几个文件要从我大学的 UNIX 服务器上删除,我无法指定它们的名称,因为它们是用复杂的文件名创建的...

编辑------

就像我说的,我能够使用

scanf("%s", filename);

获得一个工作文件名(没有换行符)。但是,无论我在 while 循环中使用 scanf 还是 fgets,如果我将它们与 scanf 一起用于文件名,我都无法将任何内容写入文件,因为它不会进入 while 循环。

我应该如何重构我对文件的写入和我的 while 循环?

【问题讨论】:

  • errnofopen() 失败后设置为什么?
  • 你有写权限吗?我问是因为您说的是您大学的服务器,而这些类型的设置通常具有严格的权限
  • @Sithregal 避免混合 fgets 和 scanf 可能是值得的。如果将换行检查更改为: if (filename[strlen(filename)-1] == '\n') {filename[strlen(filename)-1] = '\0';} 它似乎对我有用,但是您还将最后一个空行写入文件。您可能会更好地使用 do...while 循环而不是 while 循环,根据我的经验,这是一个未被充分利用的结构 :-)

标签: c file file-io stdio


【解决方案1】:

您对换行符的检查是错误的;您正在查看文件名中的最后一个字符,但如果用户输入的文件名小于最大值,则可能在此之前。然后,您尝试打开名称中包含换行符的文件。

【讨论】:

    【解决方案2】:

    这些行似乎不正确:

    if (filename[name_length-1] == '\n')    // if last char in stream is newline,
        {filename[name_length-1] = '\0';}   // remove it
    

    您验证 name_length - 1 个字符,在您的情况下为 19,而不考虑引入的文件名的长度。因此,如果您的文件名长度小于 18,您将不会替换字符串末尾的 '\n' 字符。显然文件名不能包含'\n'字符。

    你需要先获取文件名的大小,以strlen()为例。

    if (filename[strlen(filename) - 1] == '\n')
    {
        filename[strlen(filename) - 1] = '\0';
    }
    

    (不要忘记包含 string.h 标头)

    我希望我能够帮助我的英语薄弱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多