При записи в файл, помимо текста добавляются различные символы, хотя если вызывать функцию без переменной с текстом, то все хорошо.
В чем может быть проблема?
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;
Массив 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);
Лучше было бы написать функцию таким образом, что она получает буфер как аргумент, а возвращает число прочитанных байтов.
помимо текста добавляются различные символы
Это говорит о том, что ваш текст, скорее всего, не завершен нулевым символом, как того требует
fout << data; // запись строки в файл
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть виджет, назовем его Link, и окно MainWindowНужно сделать так, чтобы по нажатию на виджет Link выполнялось какое-то действие из MainWindow, например...
Использую статические открытые переменные типа QMapЗаполнение произвожу с помощью статической функции, которая возвращает QMap
Есть некоторая функция, принимающая в качестве аргумента вектор любого типа через шаблон