gpt4 book ai didi

转换函数以从字符串而不是 C 中的文件读取

转载 作者:太空狗 更新时间:2023-10-29 16:09:47 25 4
gpt4 key购买 nike

我的任务是更新当前从磁盘读取配置文件并填充结构的函数:

static int LoadFromFile(FILE *Stream, ConfigStructure *cs)
{
int tempInt;

...

if ( fscanf( Stream, "Version: %d\n",&tempInt) != 1 )
{
printf("Unable to read version number\n");
return 0;
}
cs->Version = tempInt;
...

}

允许我们绕过将配置写入磁盘,而是直接将其传递到内存中,大致等同于:

static int LoadFromString(char *Stream, ConfigStructure *cs)

需要注意的几点:

  • 当前的 LoadFromFile 函数非常密集和复杂,以向后兼容的方式读取几十个版本的配置文件,这使得整个逻辑的重复非常痛苦。
  • 生成配置文件的函数和读取配置文件的函数源自旧系统的完全不同的部分,因此不共享任何数据结构,所以我无法直接传递它们。我可能会编写一个包装器,但同样,它需要以向后兼容的方式处理传入的任何结构。
  • 我很想将文件按原样作为字符串传递(如上面的原型(prototype)所示)并将所有 fscanf 转换为 sscanf,但随后我必须处理递增指针(并可能处理缓冲区溢出错误) 手动。
  • 这必须保留在 C 中,因此没有像流这样的 C++ 功能在这里提供帮助

我是否缺少更好的选择?有没有什么方法可以创建一个 FILE * 实际上只是指向内存中的某个位置而不是磁盘上的位置?非常感谢任何指示、建议或其他帮助。

最佳答案

如果您不能传递结构并且必须将数据作为字符串传递,那么您应该能够调整您的函数以从字符串而不是文件中读取。如果函数像您描述的那样复杂,那么转换 fscanf->sscanf 可能是最直接的方法。

这是使用上面的函数原型(prototype)的一个想法。读入整个数据字符串(不处理任何内容)并将其存储在本地缓冲区中。这样代码就可以像访问文件一样随机访问数据,并使缓冲区溢出更容易预测和避免。从 malloc 合理大小的缓冲区开始,将数据复制到其中,然后根据需要重新分配自己更多的空间。一旦您拥有整个数据缓冲区的本地副本,扫描它并提取您需要的任何数据。

请注意,如果 '\0' 字符是有效输入,这可能会变得棘手。在这种情况下,您将不得不添加额外的逻辑来测试这是输入字符串的结尾还是只是一个零字节(难度取决于数据缓冲区的特定格式)。

关于转换函数以从字符串而不是 C 中的文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2450710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com