注册 登录
编程论坛 C语言论坛

对于不确定字符串长度时,各位大佬有什么好方法将其读入内存。fread和fgets都有大小限制

NullUser 发布于 2023-09-27 15:59, 494 次点击
文件内容如下:
DeleteFileList:

C:\Users\znypp\Desktop\Learn\temp\11.txt

C:\Users\znypp\Desktop\Learn\temp\22.txt

C:\Users\znypp\Desktop\Learn\temp\222.txt
从第二行开始,一行一行读,大佬们有什么骚操作吗?


[此贴子已经被作者于2023-9-27 16:02编辑过]

3 回复
#2
forever742023-09-28 09:45
应帖主要求,正规操作不予考虑。
第一式,化整为零。
可以读入一层,就CD一层,CD下一层,就抛弃上一层。
第二式,金蝉脱壳。
写一个shell脚本/批处理文件干这个活,程序里简单调用一下。
第三式,掩耳盗铃。
找到路径中的mount point,umount it。眼不见,心不烦。

#3
rjsp2023-09-28 10:01
未验证其正确性

程序代码:
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

bool getline( FILE* file, char** pbuf, size_t* pbuf_size )
{
    char* buf = *pbuf;
    size_t buf_size = *pbuf_size;

    enum { INITIAL_SIZE = 260 };
    bool result = false;
    for( size_t valid_size=0; ; )
    {
        if( buf_size==0 || valid_size!=0 )
        {
            buf_size = buf_size==0 ? INITIAL_SIZE : 2*buf_size;
            char* buf_new = realloc( buf, buf_size );
            if( !buf_new )
                return false;
            buf = buf_new;
        }

        char* r = fgets( buf+valid_size, buf_size-valid_size, file );
        if( !r )
            break;

        valid_size += strlen( buf+valid_size );
        if( buf[valid_size-1] == '\n' )
        {
            buf[valid_size-1] = '\0';
            result = true;
            break;
        }
      

        if( feof(file) )
        {
            result = true;
            break;
        }
    }

    *pbuf = buf;
    *pbuf_size = buf_size;
    return result;
}

int main( void )
{
    FILE* file = fopen( "D:/sources/Cpp005/test.txt", "rt" );
    if( !file )
    {
        puts( "文件打开失败." );
        return 1;
    }

    char* buf = NULL;
    size_t buf_size = 0;
    for( ; getline(file,&buf,&buf_size); )
    {
        puts( buf );
    }
    free( buf );
    if( !feof(file) )
    {
        puts( "文件读取失败." );
        return 2;
    }

    fclose( file );
    return 0;
}

#4
纯蓝之刃2023-10-04 10:40
先获取文件大小,申请动态内存,然后进行分段读取。
1