在C中读取长ASCII文件

时间:2009-10-25 10:08:17

标签: c file

在C中,如果我通过函数fgetc从文件中读取一行,则可能存在堆栈溢出。假设有些人编写了一个程序,它在特定文件的一行中输出一大行ASCII数据。如何在C程序中读取该数据以进行筛选?我知道我只能阅读,一次说100个字符,但我不知道如何从特定位置开始阅读。

4 个答案:

答案 0 :(得分:1)

您可以使用 read()函数一次读取一组大小(比如说100个字节)。你只是继续这样做是一个循环,直到read()表明没有什么可读的。 read()返回读取的字节数,因此当它返回的内容少于你请求的字节数时,你知道你已经完成了。

答案 1 :(得分:1)

另请参阅mmap()

mmap整个文件,您可以将结果视为将整个文件读入数组。 有了不必分配任何记忆的奖励。

无论是谁投票给我,我都希望看到你为什么寻求和阅读的解释比mmap更好

答案 2 :(得分:1)

您可以使用malloc()动态分配char数组,然后使用fgetc()逐个字符地读取文件。当你到达缓冲区的末尾时,你调用realloc()来扩展缓冲区,然后继续读取字符。这样,唯一的错误就是“内存不足”错误。

char *buffer = malloc( 200 );
unsigned int buffer_size = 200;
unsigned int current = 0;
char read;

do
{
    read = fgetc( stream );
    if ( current >= buffer_size - 1 )
    {
        buffer_size += 200;
        buffer = realloc( buffer, buffer_size );
    }
    buffer[current++] = read;
}
while ( read != '\n' );
buffer[current++] = '\0';

(上面的代码中缺少:检查realloc的返回值以处理内存不足的情况)

答案 3 :(得分:0)

咨询fseek()和ftell()。