【问题标题】:Alternatives of fopen, fread for reading from string?从字符串读取的 fopen、fread 的替代方案?
【发布时间】:2018-11-04 20:36:52
【问题描述】:

我有一个与某个库集成的代码,我无法修改并从文件中读取。我需要把它变成从字符串而不是从文件中读取。

string str = "I now have the string from file.txt in memory";

// original code:
FILE *file = fopen("file.txt", "rb");
// ...
uint8_t buffer[128];
// ...
var->var1 = buffer;
// ...
var->var2 = fread(buffer, 1, 128, file);
// ...

那么一个简单的问题,fread 从字符串读取到缓冲区的替代方法是什么?

平台:Windows

【问题讨论】:

  • 首先请选择一种语言:你是用C还是C++编程?它们都是非常不同的语言。其次,你在什么平台上?它会告诉我们有哪些选择。最后,也许你应该检查一下the fread function 实际上返回了什么?
  • @Someprogrammerdude 它返回什么没什么大不了的,我只需要一些东西来缓冲字符串,比如文件可以通过使用 fread
  • 没有从字符串中读取流的等效函数。如果您的库使用fread 从文件中读取,那么备用函数将如何提供帮助?你需要模拟文件,而不是替换函数
  • 当然,您可以将字符串放入文件并从那里读取。现在,为避免接触磁盘,您可以使用内存支持文件。
  • @Someprogrammerdude 哎呀,抱歉,修正了错字

标签: c string file fread


【解决方案1】:

如果您不需要FILE *,如果您只需要将计数字符从一个缓冲区(或字符串)复制到另一个缓冲区,这就是memcpy 的用途。例如,对于第一个近似值,您可以替换

fread(buffer, 1, 128, file);

memcpy(buffer, str, 128);

现在,如果 str 不包含 128 个字符,这将非常糟糕。 (如果您的 file 上的字符少于 128 个,fread 将给您少于 128 个字符。)所以更安全的替换是

int n = 128;
if(strlen(str) < n) n = strlen(str);
memcpy(buffer, str, n);

【讨论】:

  • 有没有办法替换 memcopy 上的长度/单个大小参数(在本例中为 1)?
  • @bluejayke 只是相乘。也就是说,一般情况下,第一个示例变为“您可以将fread(buffer, m, n, file) 替换为memcpy(buffer, str, m*n)”。
【解决方案2】:

有一个函数可以完全满足您的需求:fmemopen。你给它一个指向内存中字符串缓冲区的指针,和一个"r""w" 标志(就像fopen),它给你一个普通的旧FILE *,你可以读取或写入 - - 或者,在您的情况下,传递给需要 FILE * 来读取或写入的函数。

它在 glibc 中可用,因此几乎在所有版本的 Linux 中都可用。我认为它在某些版本的 Unix 中可用。我的 Mac 上好像没有。恐怕你很难在 Windows 上找到它。

【讨论】:

  • fmemopen() 由 POSIX 在其 2008 年修订版中标准化。因此,我希望 OSX 拥有它,但您可能需要定义一个适当的功能测试宏(请参阅其文档)来获取函数声明。但是当然,OSX 在标准一致性方面有时会有点令人惊讶。请注意,fmemopen() 不在 C 标准本身中。但是,Windows 可能没有
【解决方案3】:

如果我正确理解您的任务,您需要从字符串中获取信息,就好像它们是从文件中写入的一样。 std::stringstream,如果您使用的是 C++,一个非常舒适的解决方法。

【讨论】:

  • OP 已经通过他的标签澄清说他使用的是 C,而不是 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多