簡體   English   中英

C程序無法創建輸出文本文件

[英]C Program unable to create output text file

我的一個朋友需要在他的一個課程中使用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循環?

您檢查換行符有誤; 您正在查看文件名中的最后一個字符,但是如果用戶輸入的文件名短於最大字符,則可能早於此。 然后,您嘗試打開名稱中包含換行符的文件。

這些行似乎是不正確的:

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標頭)

我希望我能幫助我的英語水平不高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM