C ++ добавить в строку и записать в файл - PullRequest
3 голосов
/ 24 августа 2010

Почему следующий код не работает

#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

Что не так с кодом?

Ответы [ 5 ]

11 голосов
/ 24 августа 2010

Почему вы не используете operator<<?

ofstream myfile;
myfile.open ("data.txt");
for ( int i = 1; i <= 5; ++i )
  myfile << i << "\n";
myfile.close();
2 голосов
/ 24 августа 2010

Многочисленные проблемы с вашим кодом.Прежде всего, вы #include имеете несколько устаревших заголовков, включая <stdio.h>, который должен быть <iostream>, <string.h>, который должен быть <string>, и <stdlib.h>, который должен быть <cstdlib>.

Что касается вашего конкретного вопроса, он делает именно то, что вы просили его сделать.Проблема в том, что вы не просили его сделать то, что вы хотели сделать.В вашем коде 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 голос
/ 24 августа 2010

В качестве альтернативы вы также можете использовать 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";
    }
1 голос
/ 24 августа 2010

Я не верю, что operator + = (int) определен для std :: string, поэтому строка data += i; будет, если она вообще скомпилируется, будет выглядеть так:

 data += (char) i;

Давайтеиспользуйте здесь действительные символы:

char i='0';   

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

Кроме того, вы включаете <string.h>, которая является библиотекой C для времени выполнения строк (здесь строка представляет собой массив крошечных целых чисел);Что вам действительно нужно включить, так это <string>, которая является библиотекой C ++ для std :: string.Насколько я могу судить, вам вообще не нужны stdio.h, stdlib.h или string.h.

1 голос
/ 24 августа 2010

Основная проблема, которую я вижу, состоит в том, что вы строите из строковых данных, добавляя к ним целые числа.
Что вам действительно нужно, так это символьная версия целого числа, для которой потребуется что-то вроде этого:

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

Для этого добавляется смещение (48) от десятичного представления к представлению числа ASCII .
РЕДАКТИРОВАТЬ: Проверено, в зависимости от того, хотите ли выпечатать до 6 или нет, вы также захотите заменить while(i <= 5) на while(i < 5) из-за того, как вы настроили внутреннюю часть цикла while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...