在C语言中读取长ASCII文件

在C语言中读取长ASCII文件,c,file,C,File,在C语言中,如果通过函数fgetc从文件中读取一行,可能会出现堆栈溢出。假设有人编写了一个程序,在特定文件的一行中输出大量ASCII数据。如何将C程序中的数据读取到屏幕上?我知道我只能读取,比如说一次读取100个字符,但我不知道如何从特定位置开始读取。请查阅fseek()和ftell()。您可以使用read()函数一次读取设置大小(比如100字节)。这是一个循环,直到read()指示已无任何内容可供读取为止。read()返回读取的字节数,因此当它返回的字节数小于您请求的字节数时,您就知道您已经完

在C语言中,如果通过函数fgetc从文件中读取一行,可能会出现堆栈溢出。假设有人编写了一个程序,在特定文件的一行中输出大量ASCII数据。如何将C程序中的数据读取到屏幕上?我知道我只能读取,比如说一次读取100个字符,但我不知道如何从特定位置开始读取。

请查阅fseek()和ftell()。

您可以使用read()函数一次读取设置大小(比如100字节)。这是一个循环,直到read()指示已无任何内容可供读取为止。read()返回读取的字节数,因此当它返回的字节数小于您请求的字节数时,您就知道您已经完成了。

另请查看
mmap()

mmap整个文件,您可以将结果视为将整个文件读入数组。 还有一个好处就是不需要分配任何内存


不管是谁否决了我,我真的很想看看你对为什么seek&read比mmap更好的解释。你可以使用malloc()动态分配一个字符数组,然后使用fgetc()逐个字符读取文件。当到达缓冲区的末尾时,调用realloc()扩展缓冲区,然后继续读取字符。这样,唯一的错误就是“内存不足”错误


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

Fread当然允许从特定位置读取。fread()将始终从文件的“当前位置”读取(该位置是特定的,可以由fseek修改)。但是,没有办法在fread中指定当前的pos。我没有投你反对票,但我的反对意见是,它不能解决类的一般问题。在这种特定的情况下,它可以工作,但在插座、外部设备等方面存在完全相同的问题,而在这些情况下,它不会工作。鉴于OP似乎相对缺乏经验,最好是教授最佳实践,而不是提出一些可能会让他在没有准备的情况下感到困惑的建议。
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';