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

问题描述 投票:-2回答:1

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

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吗?

c file
1个回答
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,这意味着文件已到达,否则会发生错误。

© www.soinside.com 2019 - 2024. All rights reserved.