fopen的替代品,从字符串读取的fread?

时间:2018-05-25 12:30:33

标签: c string file fread

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

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);
// ...

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

平台:Windows

3 个答案:

答案 0 :(得分:1)

一个能够完全符合您需求的功能:fmemopen。你把它指向一个内存中的字符串缓冲区,一个brew install phpcomposer global require laravel/valet标志(就像valet install),它给你一个常规的旧"r"您可以阅读或写入 - 或者,在您的情况下,传递给需要"w"读取或写入的函数。

它可以在glibc中使用,因此几乎可以在所有版本的Linux中使用。我认为它可以在某些版本的Unix中使用。我似乎没有在我的Mac上。我担心你可能很难在Windows上找到它。

答案 1 :(得分: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);

答案 2 :(得分:0)

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