Потеря информации при записи массива в файл - PullRequest
0 голосов
/ 16 мая 2018

У меня проблема. Я хотел использовать libcurl и libtidy для сохранения файла html в xml на моем компьютере.

Это код, который я нашел для получения сайта (в моем случае для тестирования google.com), а затем для его приближения. Я взял его из нескольких источников и соединил.

CURL *curl;
std::string readBuffer;

curl = curl_easy_init();
if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    curl_easy_cleanup(curl);
}

const char* input = readBuffer.c_str();

TidyBuffer output = {0};
TidyBuffer errbuf = {0};
int rc = -1;
Bool ok;

TidyDoc tdoc = tidyCreate();
std::cout << "Tidying..." << std::endl;

ok = tidyOptSetBool(tdoc, TidyXhtmlOut, yes);
if (ok)
    rc = tidySetErrorBuffer(tdoc, &errbuf);
if (rc >= 0)
    rc = tidyParseString(tdoc, input);
if ( rc >= 0 )
    rc = tidyCleanAndRepair( tdoc );               
if ( rc >= 0 )
    rc = tidyRunDiagnostics( tdoc );               
if ( rc > 1 )                                    
    rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
if ( rc >= 0 )
    rc = tidySaveBuffer( tdoc, &output );          

if ( rc >= 0 )
{
    if ( rc > 0 )
    printf( "\nAnd here is the result:\n\n%s", output.bp );
}
else
    printf( "A severe error (%d) occurred.\n", rc );

Результат сохраняется в output.bp как byte *. Теперь я попытался записать это в файл .txt, только для целей тестирования (позже в файл XML). Для этого я использую следующие строки кода:

std::ofstream file;
file.open("C:/Testing/1.txt", std::ios_base::binary);
assert(file.is_open());

auto * charArray = (char*) output.bp;

file.write(charArray, sizeof(charArray));

file.close();

Файл создается в указанной позиции, но сохраняются только несколько символов:

<html it

Остальная часть документа просто пуста, никаких строк или чего-либо еще, вот и все, что будет сохранено. Я действительно понятия не имею, почему это происходит, когда при распечатке output.bp все работает просто отлично.

1 Ответ

0 голосов
/ 16 мая 2018
file.write(charArray, sizeof(charArray));

sizeof(charArray) всегда равно 8 (в 64-битной архитектуре), поскольку charArray - это char*.Вот почему вы записали в файл 8 символов.

Чтобы получить длину строки символов с нулевым символом в конце, вы должны использовать std::strlen().Однако, поскольку вы используете TidyBuffer, вы можете вместо этого использовать bp.size, избегая операции O (N).

...