在Linux中读取的方法读取文件中不存在的字符

问题描述 投票:0回答:1

[系统调用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 != '\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));
}

}

c linux system-calls
1个回答
0
投票
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)) {
© www.soinside.com 2019 - 2024. All rights reserved.