2010-08-24 40 views
3

爲什麼下面的代碼無法正常工作C++追加到字符串並寫入文件

#include <iostream> 
#include <fstream> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
using namespace std; 

int main(){ 
    string data; 
    int i=0; 

    while(i <= 5){ 
     i++; 
     data += i; 
     data += "\n"; 
    } 

    ofstream myfile; 
    myfile.open ("data.txt"); 
    myfile << data; 
    myfile.close(); 
} 

應該追加然後換行符,並將其寫入一個文件(即沒有按還沒有)

的文件應該是這樣的......

1 
2 
3 
4 
5 

什麼是錯的代碼?

+0

那麼,到目前爲止,您會從中得到什麼? – James 2010-08-24 16:29:55

+1

哪裏的main()??? – 2010-08-24 16:30:53

+0

該程序不會編譯。 main()在哪裏? – riwalk 2010-08-24 16:32:14

回答

11

爲什麼不使用operator<<

ofstream myfile; 
myfile.open ("data.txt"); 
for (int i = 1; i <= 5; ++i) 
    myfile << i << "\n"; 
myfile.close(); 
+0

+1:另外:如果中間字符串表示形式很重要,在流的位置使用stringstream來訪問字符串表示。 – rubenvb 2010-08-24 16:37:42

+0

+1這是最正確的答案,除非有建立字符串的理由(即在將文件扔到文件中之前完成的操作),那麼沒有理由讓它存在。 – James 2010-08-24 16:39:45

+0

:P方式太簡單了... – 2010-08-24 16:42:18

1

我看到的主要問題是,您正在通過向其中添加整數來構建字符串數據。
你真正想要的是整數的字符版本將要求是這樣的:

while(i <= 5){ 
    i++; 
    data += char(i+48); 
    data += "\n"; 
} 

這樣做是從十進制表示增加偏移量(48)的數量的ASCII表示。
編輯:測試這個,這取決於如果你想打印多達6或不是你也想要取代while(i <= 5)while(i < 5)因爲你設置while循環的內部的方式。

+0

恕我直言,這項任務會更好地閱讀'數據+ ='0 '+ i;'。以這種方式,不需要'char' cast,因爲變量'i'由編譯器轉換。 – 2010-08-24 16:35:50

+0

工作得非常好,這是很簡單 – 2010-08-24 16:37:07

+0

@ThomasMatthews它是更好的閱讀這種方式,但是我相信在看到文字上的'我+ 48'將更好地表達轉換到OP的性質。 – James 2010-08-24 16:38:28

1

我不認爲運營商+ =(INT)爲的std :: string定義,因此該行data += i;會,如果它編譯可言,是意爲:

data += (char) i; 

讓我們用實際字符在這裏:

char i='0'; 

while(i <= '5'){ 
    i++; 
    data += i; 
    data += "\n"; 
} 

此外,要包括<string.h>這是字符串中使用C運行時庫(微整數的字符串這裏是數組);你實際需要包括的是<string>這是std :: string的C++庫。據我所知,你根本不需要stdio.h,stdlib.h或string.h。

+0

是的,我修正了注意到並修復了 2010-08-24 16:40:50

+0

我需要stdio.h,stdlib.h或string.h因爲這是一個更大功能的片段:P – 2010-08-24 16:41:21

1

或者你也可以用sprintf爲:

char temp[10]; // assuming your string rep of the number won't take >9 char. 

    while(i <= MAX){ 
      i++; 
      sprintf(temp,"%d",i); 
      data += temp; 
      data += "\n"; 
    } 
2

與您的代碼多個問題。首先,你是#include -ing幾個不贊成的標題,包括<stdio.h>應該是<iostream>,<string.h>應該是<string><stdlib.h>應該是<cstdlib>

至於你的具體問題,它正在做你要求它做的。問題是,你沒有要求它做你想要的它要做的事情。在您的代碼data += i;中,您的意思是「將二進制值i附加到此string」,您的代碼將盡職盡責。如果你在一個支持二進制文本編輯器中打開你的結果文本文件,你會發現它是你插入的二進制數據。

你想做的是將整數轉換爲它們的字符串表示形式,並將其附加到文本文件中。用C++ ish方法做到這一點的一個簡單方法是使用stringstream,如下所示:

#include <iostream> 
#include <fstream> 
#include <iostream> 
#include <string> 
#include <sstream> 
#include <cstdlib> 
using namespace std; 

int main(){ 
    int i=0; 

     stringstream ss; 
    while(i <= 5){ 
     i++; 
      ss << i << endl; 
    } 

    ofstream myfile; 
    myfile.open ("data.txt"); 
    myfile << ss.str(); 
    myfile.close(); 
}