У меня проблема при чтении из файла. Код ниже заканчивается ошибкой во время выполнения после 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 ;
}
Я также думаю, что ошибка во время выполнения вызвана причиной использования функции 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;
}
Я думаю, что вы ifstream::read()
вызываете ifstream::read()
. read()
добавляет нулевой символ в конце для вас, и вам нужно проверить eofbit
и failbit
.
Цитата из руководства,
Количество символов, успешно прочитанных и сохраненных этой функцией, можно получить, вызвав член gcount.
read()
не добавляет нулевой символ, тогда sprintf()
будет читать после конца буфера, если в нем случайно нет нулевых символов. Вот где вы увидите последствия ошибки, но настоящая ошибка произошла раньше, когда вам не удалось добавить нулевой символ в конец ваших данных. Отладка намного сложнее, если вы предполагаете, что фактическая ошибка всегда находится на той же строке, что и проблема.