fopen 的替代品,害怕从字符串中读取?
Alternatives of fopen, fread for reading from string?
我有一个代码与某个库集成,我无法修改和读取文件。我需要把它变成从字符串而不是从文件中读取。
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++,那么解决该问题的一种非常舒适的方法是 std::stringstream。
是一个函数,它可以完全满足您的需求:fmemopen
。你给它一个指向内存中字符串缓冲区的指针,和一个 "r"
或 "w"
标志(就像 fopen
),它给你一个常规的旧 FILE *
您可以读取或写入 - 或者,在您的情况下,传递给需要 FILE *
读取或写入的函数。
它在 glibc 中可用,因此在 Linux 的几乎所有版本中都可用。我认为它在某些版本的 Unix 中可用。我的 Mac 上似乎没有它。恐怕 Windows.
你可能很难找到它
如果您不需要 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);
我有一个代码与某个库集成,我无法修改和读取文件。我需要把它变成从字符串而不是从文件中读取。
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++,那么解决该问题的一种非常舒适的方法是 std::stringstream。
是一个函数,它可以完全满足您的需求:fmemopen
。你给它一个指向内存中字符串缓冲区的指针,和一个 "r"
或 "w"
标志(就像 fopen
),它给你一个常规的旧 FILE *
您可以读取或写入 - 或者,在您的情况下,传递给需要 FILE *
读取或写入的函数。
它在 glibc 中可用,因此在 Linux 的几乎所有版本中都可用。我认为它在某些版本的 Unix 中可用。我的 Mac 上似乎没有它。恐怕 Windows.
你可能很难找到它如果您不需要 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);