read() 读取文件中不存在的字符

read() reads characters that do not exist in the file

系统调用 read() 从文件中获取字符,它还会读取每个缓冲区末尾不存在的字符。

文件有字符串: "AAOOOOOBRRRRRRIIIIIGGGGGGIIIIIINNNNNAAAALLLLLEEEEXXZZZSS"

读取时,缓冲区包含: "AAOOOOOBRRRRRRIIIIIGGGGGGIIIIIINNNNNAAAALLLLLEEEEXXZZZSS??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 != '[=10=]')
        { 
            //BUCLE QUE RECORRE EL BUFFER
            int pos = 0;
            while (*(cadena + pos) != '[=10=]')
            { 
                //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 = '[=10=]';

        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 != '[=10=]'){ //BUCLE QUE RECORRE EL BUFFER

在你读取你错过的缓冲区后添加最后一个空字符第二个 期望,以便继续找到你从未设置的空字符,当然这个是未定义的行为。

您可以在 buff[r] 处添加空字符,但假设您最多读取 99 个字节而不是 100 个或 buff需要大小为 101,否则只需将第二个 while 替换为

while (ptrBuf != (buff + 100)) {

警告循环也有问题

while(*(ptrBuf + 1) == *ptrBufRes)

哪里可以读出字节/出buff

这条语句顺序:

while ((r = read(src, buff, 100)) > 0)
{

后面需要:

    buf[ r ] = '[=11=]';

以便 NUL 终止读取的字符串,因为函数:read() 不会那样做。