定义EOF字符

时间:2012-03-22 17:25:53

标签: c posix

出于好奇,可以暂时添加一个应该被解释为EOF的角色吗?例如,在循环中使用read()系统调用,并通过将新行字符暂时注册为EOF使其在'\n'上中止。

2 个答案:

答案 0 :(得分:3)

不,不可能。如果你想从文件描述符中读取,直到你遇到一个特定的字符,并且避免读取任何文件描述符(例如,为了不消耗其他进程稍后需要的输入),唯一的解决方案是执行1字节读取。这很慢但是就是这样。

答案 1 :(得分:3)

不容易,但您可以使用fdopen()和自定义功能执行某些操作:

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);
}

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