C 程序无法创建输出文本文件

标签 c file file-io stdio

我的一个 friend 需要在他的类(class)中使用 MATLAB,所以他调用我(计算机科学专业),问我是否可以教他 C。我熟悉 C++,所以我也熟悉一般语法,但必须阅读 C 的 IO 库。

我正在创建一些简单的 IO 程序来展示我的 friend ,但我的第三个程序给我带来了麻烦。当我使用 Eclipse(带有 CDT)在我的机器上运行该程序时,Eclipse 的控制台产生了一个故障输出,它没有提示我输入数据,而是获取输入,然后一次打印所有内容并显示失败。

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

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

我认为错误在于我如何使用 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);

得到一个有效的文件名(没有换行符)。但是无论我是否将 scanf 或 fgets 用于我的 while 循环,如果我将它们与 scanf 一起用于文件名,我将无法向文件写入任何内容,因为它不会进入 while 循环。

我应该如何重组写入文件和 while 循环?

最佳答案

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

关于C 程序无法创建输出文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694476/

相关文章:

C-尝试删除链表中的第一个节点时出现双重释放错误

c - 从不兼容的指针类型初始化 [默认启用] - 怎么了?

数据结构的 C++ 序列化

windows - 释放 Windows 文件共享锁

python - 如果我在脚本仍在执行文件 I/O 操作时突然关闭脚本,会发生什么情况?

c - C语言中 'objects'是什么意思?

java - 如何逐行打印字符串对象

尝试读取文件时代码崩溃

c - 这可能是 select/poll/epoll/kqueue 的竞争吗?

c - C 中的子字符串复制函数导致 seg