2016-01-17 233 views
0

該程序接受輸入,逐個字符地寫入文件,計算輸入的字符數量,然後在最後將其複製到一個字符數組中。該程序工作得很好,直到我們得到以下片段file.getline(arr, inputLength);。它會更改.txt文件數據並僅返回原始輸入的第一個字符。寫入和讀取同一個文件

任何想法?

#include <iostream> 
#include <fstream> 

using namespace std; 

int getLine(char *& arr); 


int main() { 
    char * arr = NULL; 

    cout << "Write something: "; 
    getLine(arr); 
    return 0; 
} 


int getLine(char *& arr) { 
    fstream file("temp.txt"); 
    char input = '\0'; //initialize 
    int inputLength = 0; //initialize 

    if (file.is_open()) { 
     while (input != '\n') { //while the end of this line is not reached 
      input = cin.get(); //get each single character 
      file << input; //write it on a .txt file 
      inputLength++; //count the number of characters entered 
     } 
     arr = new char[inputLength]; //dynamically allocate memory for this array 
     file.getline(arr, inputLength); //HERE IS THE PROBLEM!!! *** 
     cout << "Count : " << inputLength << endl; //test counter 
     cout << "Array : " << arr << endl;   //test line copy 
     file.close(); 
     return 1; 
    } 
    return 0; 
} 
+0

這可能是關於字符串沒有被寫入txt文件。對於正確的設計,如果可能的話,你應該考慮在磁盤上做最少的IO。您應該使用內存並在最後將您的數據寫入txt文件。 –

+0

你能解釋一下,通過使用代碼片段? @st。 – Peons1982

+0

另外,只有在註釋發生問題的行時,數據才能正確寫入txt文件。 @st。 – Peons1982

回答

0

我看到這個代碼至少有兩個問題。

1)std::fstream構造函數默認會打開一個現有的文件。它不會創建一個新的。如果temp.txt不存在,則is_open()將失敗。此代碼應將第二個參數的適當值傳遞給std::fstream的構造函數,該構造函數指定需要創建新文件還是創建現有文件。

與此相關:如果文件已經存在,運行此代碼將不會截斷它,所以從該程序的上一次運行文件的內容將有明顯的意外結果。

2)此代碼的目的似乎是回讀之前寫入其中的內容temp.txt。要正確地做到這一點,在書寫之後和閱讀之前必須回溯到文件的開頭。這部分似乎不見了。

+0

你會修改我的代碼與您提到的建議。 – Peons1982

+0

我爲什麼要這麼做?這不是一個網站,你可以讓別人做你的家庭作業。 –

0

沒有必要進行動態分配,因爲std庫函數會混淆混合參數,如cstring和指向cstring的指針。我在Visual Studio 2015編譯器中測試了這段代碼。它運作良好。確保包括所有需要的庫:

#include <iostream> 
    #include <fstream> 
    #include<cstring> 
    #include<string> 
    using namespace std; 
    void getLine(); 
    int main() { 

    cout << "Write something: "; 

    // no need to pass a pointer to a cstring 
    getLine(); 
    system("pause"); 
    return 0; 
    } 

    void getLine() { 
     char input[100]; // this is a cstring with 
     //a safe const number of elements 

     int inputLength; //to extract length of the actual input 

     //this function requires cstring as a first argument 
     // and constant length as a second 
     cin.get(input, 100, '\n'); //get each single character 

     //cast streamsize into int 
    inputLength = static_cast<int>(cin.gcount()); 

    //testing input 
    cout << "Input: \n"; 
    for (int i = 0; i < inputLength; i++) 
    { 
     cout << input[i]; 
    } 

     cout << endl; 

     char arr[100]; 

     strcpy_s(arr, input); 

     cout << "Count : " << inputLength << endl; //test counter 

     cout << "Array : " << endl;   //test line copy 

     for (int i = 0; i < inputLength; i++) 
     { 
     cout << arr[i]; 
     } 
     cout << endl; 

     // write cstring to a file 
     ofstream file; 
     file.open("temp.txt", ios::out); 
     if (file.is_open()) 
     { 
      //write only what was entered in input 
      for (int i = 0; i < inputLength; i++) 
      file << arr[i]; 
      file.close(); 
     } 

       else cout << "Unable to open file"; 
    }