2010-08-24 94 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(); 
}