2016-01-06 3 views
0

В настоящее время я получаю данные с компьютера Windows в систему linux, которая имеет следующую реализацию. Он считывает данные и записывает его в файлЗапись данных, полученных из сокета в файл в C++

char buffer[4096]; 
int BUFSIZE=4096; 
std::ofstream file(INPUT_PS_FILE_NAME, std::ios::out|std::ios::binary); 
while (bytes_read > 0) 
{ 
    buffer[bytes_read] = 0; 
    bytes_read = recv(newsockfd, buffer, BUFSIZE - 1, 0); 
    if(bytes_read>0) { 
     file.write(buffer,BUFSIZE-1); 
     printf("Buffer: %s\n", buffer); 
    } 
} 

Теперь иногда в моем файле я хотел бы получить целую кучу «\ 00 \ 00 \ 00 \ 00 \ 00 ...» в моем файле, а иногда и его отлично, но никогда не на консоли машины. Мое понимание это происходит потому, что printf при передаче массива будет печатать все содержимое массива до тех пор, пока оно не встретит нулевой символ, однако file.write этого не делает. Пожалуйста, дайте мне знать, если мое понимание верное. Также, чтобы решить эту проблему, есть ли способ для меня, чтобы file.write вел себя как printf, где он печатает только до тех пор, пока не будет найден NULL-окончание?

+0

Ну, он собирается написать все, что вы вернулись в буфер. – OldProgrammer

+0

Я бы не хотел печатать \ 0 \ 0 – MistyD

+3

, вы не должны писать больше байтов, чем вы читали, вы должны использовать что-то вроде 'file.write (buffer, bytes_read)' – mpromonet

ответ

2

Вы используете цикл while, который проверяет bytes_read до того, как recv() был вызван в первый раз. Вместо этого используйте петлю do/while. И вы также не выводите корректные данные чтения. При выводе данных необходимо учитывать bytes_read. Вы пишете слишком много байтов до file, а не с нулевым завершением буфера для printf().

Попробуйте вместо этого:

char buffer[4096]; 
std::ofstream file(INPUT_PS_FILE_NAME, std::ios::out|std::ios::binary); 
do 
{ 
    bytes_read = recv(newsockfd, buffer, sizeof(buffer), 0); 
    if (bytes_read > 0) { 
     file.write(buffer, bytes_read); 
     printf("Buffer: %.*s\n", bytes_read, buffer); 
     //or: printf("Buffer: %*.*s\n", bytes_read, bytes_read, buffer); 
    } 
} 
while (bytes_read > 0); 
+0

Спасибо, что ответили на это. @mpromonet предложил это, и это сработало. Спасибо, что прояснил это – MistyD

1

Ваше понимание неверное. printf (и все варианты) записывают форматированный текст в выходной поток до символа NULL (\0), который находится в строке формата, а строковые параметры (%s) соответствуют той же логике. write с другой стороны имеет дело с байтами и «игнорирует» значения. Он будет писать NULL без различия.

Если вы хотите написать форматированный текст в файл, используйте fprintf.

Смежные вопросы