C++字符串追加并写入文件

3
为什么以下代码不起作用?
#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

这段代码有什么问题?


到目前为止,你从中得到了什么? - James
程序无法编译。main()在哪里? - riwalk
2
<stdio.h> 应该替换为 <iostream><string.h> 应该替换为 <string><stdlib.h> 应该替换为 <cstdlib>。如果你参考的是一本书,那么你需要一本新的书。 :) 推荐阅读 Accelerated C++,请参见这里:https://dev59.com/_3RC5IYBdhLWcg3wK9yV。 - John Dibling
5个回答

11

为什么你不使用 operator<<

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

+1:另外,如果中间字符串表示很重要,请使用stringstream代替ofstream以便访问字符串表示。 - rubenvb
+1 这是最正确的答案,除非有理由构建字符串(即在将其放入文件之前进行操作),否则它没有存在的必要。 - James

2
你的代码存在多个问题。首先,你包含了几个已经不再使用的头文件,包括应该是 <iostream><stdio.h>、应该是 <string><string.h> 以及应该是 <cstdlib><stdlib.h>

至于你具体的问题,它正在按照你要求的方式执行。问题是,你没有要求它做你想要的事情。在你的代码 data += i; 中,你是在说“将二进制值 i 附加到这个 string”,你的代码忠实地执行了这个操作。如果你在一个支持二进制的文本编辑器中打开生成的文本文件,你会发现它是你插入的二进制数据。

你想要做的是将整数转换为它们的字符串表示形式,并将其附加到文本文件中。一种简单的 C++ 方法是使用 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();
}

1
我看到的主要问题是您正在通过将整数添加到字符串数据来构建。
实际上,您想要的是整数的字符版本,这需要类似于以下内容:
while(i <= 5){
  i++;
  data += char(i+48);
  data += "\n";
}

这个操作是将十进制表示的数字与ASCII表示相加偏移量(48)。
编辑:测试过了,根据你是否想打印到6位数,你还需要将while(i <= 5)替换为while(i < 5),因为你设置了while循环内部的方式。


在我看来,赋值语句写成 data += '0' + i; 会更好。这样就不需要进行 char 强制转换了,因为变量 i 会被编译器自动转换。 - Thomas Matthews
工作得非常好,这很简单。 - Mark Lalor
@ThomasMatthews 这样阅读更好,但我认为直接看到字面上的 i+48 会更好地表达转换的本质给 OP。 - James
只要你理解它在做什么,你可以用任何方式编写它。 - James

1
我不相信std::string定义了operator+=(int),所以如果这行代码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。

是的,我注意到了并修复了<string.h>为<string>。 - Mark Lalor
我需要包含 stdio.h、stdlib.h 或 string.h 头文件,因为这只是一个更大函数的一部分 :P - Mark Lalor

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";
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接