首页 文章

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

提问于
浏览
0

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

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

该程序应该从用户获取文件名,创建文件,并写入该文件,直到用户输入空行 .

当我通过控制台(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);

获取工作文件名(不带换行符) . 但无论我是否在我的while循环中使用scanf或fgets,如果我将它们与scanf一起用于文件名,我就无法写任何文件,因为它不会进入while循环 .

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

2 回答

  • 1

    这些行似乎不正确:

    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头文件)

    我希望我能帮助我的弱英语 .

  • 3

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

相关问题