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()
不会那样做。
系统调用 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()
不会那样做。