C 定义EOF字符

C 定义EOF字符,c,posix,C,Posix,出于好奇,是否可以临时添加一个应解释为EOF的字符?例如,在循环中使用read syscall,并通过临时将新行字符注册为EOF使其在“\n”上中止 不,不可能。例如,如果希望在遇到特定字符之前读取文件描述符,并避免读取超过该字符的任何内容,以免消耗另一个进程稍后需要的输入,则唯一的解决方案是执行1字节读取。速度很慢,但就是这样。不,不可能。例如,如果希望在遇到特定字符之前读取文件描述符,并避免读取超过该字符的任何内容,以免消耗另一个进程稍后需要的输入,则唯一的解决方案是执行1字节读取。它的速度

出于好奇,是否可以临时添加一个应解释为EOF的字符?例如,在循环中使用read syscall,并通过临时将新行字符注册为EOF使其在“\n”上中止

不,不可能。例如,如果希望在遇到特定字符之前读取文件描述符,并避免读取超过该字符的任何内容,以免消耗另一个进程稍后需要的输入,则唯一的解决方案是执行1字节读取。速度很慢,但就是这样。

不,不可能。例如,如果希望在遇到特定字符之前读取文件描述符,并避免读取超过该字符的任何内容,以免消耗另一个进程稍后需要的输入,则唯一的解决方案是执行1字节读取。它的速度很慢,但事实就是如此。

不容易,但您可以使用和自定义函数执行某些操作:

int freadtochar(char *buffer, int size, char character, FILE *filePtr)
{
    int index = 0;
    char c;
    while (index < size && (c = fgetc(filePtr)) != EOF && c != character)
    {
        buffer[index++] = c; 
    }

    return index;
} 

int main()
{
    int fd = STDIN_FILENO;

    FILE *filePtr = fdopen(dup(fd), "r");

    char buffer[1024];
    int bytesRead = freadtochar(buffer, 1024, '\n', filePtr);

    // buffer should now contain all characters up to '\n', but note no trailing '\0' is added
    fclose(filePtr);
}

请注意,这仍然从原始文件描述符读取数据,它只是为您缓冲数据。

不容易,但您可以使用和自定义函数执行以下操作:

int freadtochar(char *buffer, int size, char character, FILE *filePtr)
{
    int index = 0;
    char c;
    while (index < size && (c = fgetc(filePtr)) != EOF && c != character)
    {
        buffer[index++] = c; 
    }

    return index;
} 

int main()
{
    int fd = STDIN_FILENO;

    FILE *filePtr = fdopen(dup(fd), "r");

    char buffer[1024];
    int bytesRead = freadtochar(buffer, 1024, '\n', filePtr);

    // buffer should now contain all characters up to '\n', but note no trailing '\0' is added
    fclose(filePtr);
}

请注意,这仍然从原始文件描述符读取数据,它只是为您缓冲数据。

另请参见:任意字符,或仅换行?@CarlNorum在本例中是换行符,但出于好奇,请参见任意字符。如果您碰巧知道\n的特殊情况,请告诉我。@0A0D将查看链接,谢谢。另请参阅:任意字符,或仅换行?@CarlNorum在本例中是换行符,但出于好奇,请查看任意字符。如果你碰巧知道一个特殊的情况,你可以告诉。@ 0A0D将查看链接,谢谢。使用STDIO或C++等效缓冲来保存系统调用,并且可以检查下一个字符是否是你要找的。您可以将其配置为从磁盘读取数据块。谢谢,这基本上就是我所怀疑的。我有这个想法,天啊,我想知道。。并希望与堆栈溢出社区进行检查。@EdHeal:确实,如果您是唯一一个读取文件描述符的人,那么您应该这样做,但如果您想与其他进程共享fd,这将没有帮助。例如,如果要实现类似shell read命令的功能,其中后续输入保留在fd上,以便下一个命令读取,或者,如果您正在执行Web服务器,并希望它在处理头之后将请求的正文(例如POST)传递给子进程。使用STDIO或C++等效缓冲来节省系统调用,并且可以检查下一个字符是您正在寻找的。您可以将其配置为从磁盘读取数据块。谢谢,这基本上就是我所怀疑的。我有这个想法,天啊,我想知道。。并希望与堆栈溢出社区进行检查。@EdHeal:确实,如果您是唯一一个读取文件描述符的人,那么您应该这样做,但如果您想与其他进程共享fd,这将没有帮助。例如,如果您想要实现类似shell read命令的功能,其中后续输入保留在fd上,以便下一个命令读取,或者如果您正在实现Web服务器,并且希望它在处理头后传递请求正文,例如,发送到子进程。谢谢,我将采用类似的方法。注意,这仍然会从fd中提取数据;它只是为你做缓冲。还要注意,fclose会关闭原始fd,因此如果您不想这样做,则应使用fdopendupfd,r;相反,谢谢你,我将采用类似的方法。注意,这仍然会从fd中提取数据;它只是为你做缓冲。还要注意,fclose会关闭原始fd,因此如果您不想这样做,则应使用fdopendupfd,r;相反