如何使用未知大小的读取功能

时间:2018-03-01 22:19:49

标签: c file

我创建了一个打开文件并读取它们的单个字符的函数。

int getBlocks(char *file){

char c;
int line = 0;
int pos = 0;
int blocks;

FILE *inptr = fopen(file, "rt");

// Count the amount of blocks/tetriminos
while((c=fgetc(inptr))!=EOF){

    if(c == '.' || c == '#'){
        pos++;
        if(pos == 4){
            pos = 0;
            line++;
        }
    }
}

blocks = (line/4);
fclose(inptr);

return blocks;
}

现在我必须重写它,因为我允许使用的唯一功能是exitopenclosewritereadmallocfree

我认为我基本上可以使用int inptr = open(file, O_RDONLY);代替我的fopen行,而只需使用close(inptr);代替fclose函数。

我现在唯一的问题是fgetc。我很确定我可以在这里使用read,但根据它的定义ssize_t read(int fildes, void *buf, size_t nbytes);我需要事先告诉固定数量的字节,但文件大小总是不同的情况下。

你知道我怎么能在这里重写fgetc吗?

1 个答案:

答案 0 :(得分:3)

与微小变化非常相似

char chr;
int fd = open(file, O_RDONLY);
if (fd == -1)
    reutnr -1; // Or some error integer
while (read(fd, &chr, 1) == 1) { 
    /* the rest of your code */
}
close(fd);

请注意,一个重要的变化是chr的类型为char而非int

您只需检查EOF是否返回了合适的值,而不是检查read(),理想情况下,您应将其存储在某处,并在循环结束时检查它是0,这意味着到达文件的末尾,否则发生错误。