В файл записываются левые данные c++

353
28 декабря 2016, 04:30

При записи в файл, помимо текста добавляются различные символы, хотя если вызывать функцию без переменной с текстом, то все хорошо.

В чем может быть проблема?

writedata(dir, "hello moto kek lol test lul mur meow"); - все хорошо
char* kik = getdata();
writedata(dir, kik); - все плохо
void writedata(char* file, char* data)
{
    ofstream fout(file, ios_base::binary); 
    fout << data; // запись строки в файл
    fout.close(); // закрываем файл
    return;
}

upd:

int sock;
int bytes_read;
struct sockaddr_in server;
WSADATA ws;
char server_reply[2048];
memset(&server_reply, 0, sizeof(server_reply));
const int WINSOCK_VERSION = MAKEWORD(2, 2);
WSAStartup(WINSOCK_VERSION, &ws);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
server.sin_port = htons(6896);
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
{
    return "connectfail";
}
send(sock, msg, strlen(msg), 0);
bytes_read = recv(sock, server_reply, sizeof(server_reply), 0);
return server_reply;
Answer 1

Массив server_reply является локальной переменной функции getdata

char server_reply[2048];

При выходе из функции эта локальная переменная прекращает свое существование. Поэтому указатель на этот массив, возвращаемый из функции, является не действительным. В результате программа имеет неопределенное поведение.

Вы могли бы по крайней мере объявить эту локальную переменную, как имеющую статическую память при условии, что функция используется в однопоточной среде, или как имеющую спецификатор thread_local в многопоточной среде. Например,

static char server_reply[2048];

Кроме того, чтобы рассматривать массив, как содержащий строку, следует в этом предложении считывать число байтов на единицу меньше, чем размер массива

bytes_read = recv(sock, server_reply, sizeof(server_reply) - 1, 0);

Лучше было бы написать функцию таким образом, что она получает буфер как аргумент, а возвращает число прочитанных байтов.

Answer 2

помимо текста добавляются различные символы

Это говорит о том, что ваш текст, скорее всего, не завершен нулевым символом, как того требует

fout << data; // запись строки в файл
READ ALSO
Слоты и сигналы Qt

Слоты и сигналы Qt

Есть виджет, назовем его Link, и окно MainWindowНужно сделать так, чтобы по нажатию на виджет Link выполнялось какое-то действие из MainWindow, например...

448
Статическая переменная map. Использование как словарь [требует правки]

Статическая переменная map. Использование как словарь [требует правки]

Использую статические открытые переменные типа QMapЗаполнение произвожу с помощью статической функции, которая возвращает QMap

376
Ошибка компиляции при обобщении типов

Ошибка компиляции при обобщении типов

Есть некоторая функция, принимающая в качестве аргумента вектор любого типа через шаблон

364
Вывод на экран и в файл

Вывод на экран и в файл

Нужно вывести одно и то же на экран и в файл, например:

359