Вообщем тут наткнулся на непонятное мне явление, я не отрицаю что мог
где то ошибится, но никак не могу понять где, вот код:#include <iostream>
#include <cstdlib>
#include <mysql/mysql.h>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
struct r{
char **rez;
} *get;
int num;
//Connection to server and to database
bool conn(char *hostname, char *username, char *passwd, char *dbname, int port)
{
mysql_init(&mysql);
if(!(mysql_real_connect(&mysql,hostname,username,passwd,dbname,port,0,0))){
fprintf(stderr, "%s\n", mysql_error(&mysql));
return false;
}
if(mysql_select_db(&mysql,dbname)){
fprintf(stderr, "%s\n", mysql_error(&mysql));
return false;
}
return true;
}
//Query to database
bool query(char **rez, char *str)
{
int i, l = 0;
if(mysql_query(&mysql,str)){
fprintf(stderr, "%s\n", mysql_error(&mysql));
return false;
}
if(!(res = mysql_store_result(&mysql))){
if(rez) fprintf(stderr, "%s\n", mysql_error(&mysql));
return false;
}
while((row = mysql_fetch_row(res))){
for (i=0 ; i < mysql_num_fields (res); i++){
rez[l] = new char[strlen(row[i])];
rez[l] = strcpy(rez[l],row[i]);
l++;
}
}
if(!mysql_eof(res)){
fprintf(stderr, "%s\n", mysql_error(&mysql));
return false;
}
mysql_free_result(res);
return true;
}
void out()
{
int fd = open("/home/cyclon/out.html", O_WRONLY | O_CREAT);
chmod("/home/cyclon/out.html", S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP);
for(int n = 0; n < num; n++){
cout << get[0].rez[n] << "\n";
write(fd,get[0].rez[n],strlen(get[0].rez[n]));
write(fd,"<br>",strlen("<br>"));
}
close(fd);
}
int main(int argc, char *argv[])
{
get = new r[100];
conn("localhost","root","t3521098","gendw",3306);
get[0].rez = new char*[1];
query(get[0].rez,"select count(*) from content;");
num = atoi(get[0].rez[0]);
delete get[0].rez[0], get[0].rez;
get[0].rez = new char*[num];
query(get[0].rez,"select word from content;");
out();
for(int i = 0; i < num; i++){
// delete get[0].rez[i];
}
delete get[0].rez;
cout << "Done!" << endl;
return EXIT_SUCCESS;
}
Ошибка в следующем, в выходном файле, начиная с 1000-го элемента
в конце каждой строки добивает один лишний символ (мусор), а к последнему
элементу два символа. Причём это не зависит от их количества, главное
что бы их было больше 1000, может быть и 5000 и 10000, всегда одно и тоже,
один лишний символ после тысячной строки и два на последней.
Как мне кажется я где то накосячил с выделением памяти, но не могу
понять где именно.
Строка:
// delete get[0].rez[i];
закоменчена поскольку на ней происходит падение проги с сообщением
об ошибке во free , потому убрал что бы каждый раз не валилась, хотя
это первое что натолкнуло меня на ошибку. Собсно она и есть следствие
не правильного выделения памяти.
Заранее спасибо!!!