系统调用read()
从文件中获取字符,并且还读取每个缓冲区末尾不存在的字符。
文件包含字符串:“ AAOOOOOBRRRRRRIIIIIGGGGGGIIIIIINNNNNAAAALLLLLEEEEXXZZZSS”
读取时,缓冲区包含:“ AAOOOOOBRRRRRRRRIIIIIGGGGGGIIIIIINNNNNAAAALLLLLEEEEXXZZZSS ?? Bf?”
如您所见,文件中不存在最后四个字符
我的代码:
void trOpcionS(int src, int dst, char *cadena)
{
//BUFFER DE LECTURA
char buff[100];
//BUFFER DE ESCRITURA TRAS ANALIZAR EL DE LECTURA
char buffRes[100];
//bytes leidos
ssize_t r = 0;
//bucle de lectura
while ((r = read(src, buff, 100)) > 0)
{
char *ptrBuf = buff;
char *ptrBufRes = buffRes;
//bucle para analizar la lectura
while (*ptrBuf != '\0')
{
//BUCLE QUE RECORRE EL BUFFER
int pos = 0;
while (*(cadena + pos) != '\0')
{
//BUCLE QUE RECORRE LA CADENA A TRANSFORMAR
if (*(cadena + pos) == *ptrBuf)
{
//SI ENCUENTRO UNA EQUIVALENCIA, SE ESCRIBE Y SE SALTAN TODAS SUS REPETICIONES
*ptrBufRes = *ptrBuf;
while (*(ptrBuf + 1) == *ptrBufRes)
{
ptrBuf++;
}
ptrBufRes++;
break;
}
pos++;
}
//SI EL VALOR NO SE ENCUENTRA EN LA CADENA SE ESCRIBE SIN MÁS
if (pos == strlen(cadena))
{
*ptrBufRes = *ptrBuf;
ptrBufRes++;
}
ptrBuf++;
}
*ptrBufRes = '\0';
printf("Reading: %s\n", buff);
printf("%s\n", buffRes);
ssize_t w = write(dst, buffRes, strlen(buffRes));
}
}
while((r = read(src, buff, 100)) > 0){
char* ptrBuf = buff;
char* ptrBufRes = buffRes;
//bucle para analizar la lectura
while(*ptrBuf != '\0'){ //BUCLE QUE RECORRE EL BUFFER
在读取缓冲区之后,您错过了在第二个while期望处添加最后一个空字符的位置,因此一个缓冲区继续查找从未设置的空字符,这当然是未定义的行为。
您可以在buff [r]处添加空字符,但是假设您最多读取99个字节而不是100个字节,或者buff的大小需要为101,否则只需替换第二个while] >通过
while (ptrBuf != (buff + 100)) {
警告循环中也有问题
中取出]while(*(ptrBuf + 1) == *ptrBufRes)
您可以从读取的字节中取出/从buff