C ++ Массив указателей и буферизация

0

У меня проблема при чтении из файла. Код ниже заканчивается ошибкой во время выполнения после 100 циклов, после того, как трассировка обнаружила, что mybuff my не повторно инициализируется (mybuff = new char [1024];), поскольку после отладки я все еще вижу сквозное сообщение в конце его. и проблема возникает, когда я пытаюсь заполнить sendbuff из-за той же проблемы. на этом этапе происходит sprintf(sendbuff,mybuff ) aboout "Доступ к считыванию нарушения прав доступа" (sprintf(sendbuff,mybuff ))

любая идея, как решить эту проблему?

char sendbuff[1024];
char * mybuff = new char[];
While(....){
    mybuff = new char [1024];
    myfile.read(mybuff ,bufsize);
    sprintf(sendbuff,mybuff );
    ibytessent=0;    
    tmpCount = strlen(sendbuff);
    ibufferlen = strlen(sendbuff);
    ibytessent = send(s,sendbuff,ibufferlen,0);
delete [] mybuff ;
}
Теги:

2 ответа

0

Я также думаю, что ошибка во время выполнения вызвана причиной использования функции read(), как и выше. Кроме того, я не думаю, что для каждой итерации необходимо новое пространство на 1024 байта, почему бы не повторно использовать буфер ~

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

#include <cstdio>
#include <fstream>
using namespace std;
int bufsize = 1024;
int main(){
    char sendbuff[1024];
    char * mybuff = new char[];
    std::ifstream ifs;
    ifs.open ("test.txt", std::ifstream::in);
    while(1){
        mybuff = new char [1024];
        ifs.read(mybuff ,bufsize);
        sprintf(sendbuff,mybuff );
        int ibytessent=0;    
        int tmpCount = strlen(sendbuff);
        int ibufferlen = strlen(sendbuff);
        //ibytessent = send(s,sendbuff,ibufferlen,0);
        delete [] mybuff ;
    }
    return 0;
}
  • 0
    Извините забыл добавить удалить часть
0

Я думаю, что вы ifstream::read() вызываете ifstream::read(). read() добавляет нулевой символ в конце для вас, и вам нужно проверить eofbit и failbit.

Цитата из руководства,

Количество символов, успешно прочитанных и сохраненных этой функцией, можно получить, вызвав член gcount.

  • 0
    Извините, ошибка не возникает при чтении, но, похоже, она добавляется в начале массива указателей, что приводит к тому, что «на этом шаге возникает ошибка« Место чтения нарушения доступа »(sprintf (sendbuff, mybuff))»
  • 0
    Существует разница между тем, где происходит ошибка, и где она отображается . Если read() не добавляет нулевой символ, тогда sprintf() будет читать после конца буфера, если в нем случайно нет нулевых символов. Вот где вы увидите последствия ошибки, но настоящая ошибка произошла раньше, когда вам не удалось добавить нулевой символ в конец ваших данных. Отладка намного сложнее, если вы предполагаете, что фактическая ошибка всегда находится на той же строке, что и проблема.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню