我正在将 net-snmp 移植到一个只能有限访问文件系统的嵌入式平台,我偶然发现了一个大问题。有一部分核心代码使用了 ungetc() 函数,而我没有。当然有2个解决方案:
A)使用我拥有的东西编写我自己的 ungetc()
B) 修改 net-snmp 代码以在不使用 ungetc() 的情况下达到相同的结果
解决方案(B)最终将在 net-snmp coders 邮件列表中讨论,因为需要深入了解库的内部结构,所以让我们关注(A)的可行性
我在嵌入式系统上拥有的是:
fopen()
fclose()
fcreate()
fwrite()
fread()
fdelete()
fclear()
fcopy()
ffindfirst()
ffindnext()
frename()
fgetsize()
ftell()
fseek()
fgetc()
fgets()
主要区别在于我的文件函数使用 INT32* 文件句柄而不是 FILE* 类型。我没有 FILE* 类型。
ungetc() 函数所做的基本上是“将字符放回流中”,无论是它刚刚读取的字符还是另一个字符。
在第一种情况下,解决方案很简单,我用 fseek() 将指针倒回一个位置。
但在第二种情况下,我有一个问题。我将修改流而不是文件,除非我没有流!我正在直接读取文件。
使用 ungetc() 你可以做类似的事情
FILE *fp = fopen("file.txt", "r");
int c = getc (fp);
if( c == 'a' ) ungetc ('b', fp);
如果“file.txt”包含“abcdefghi”,那么使用gets() 的后续读取将读取“bbcdefghi”而不是“abcdefghi”,因为流中的内容已更改,但文件未更改!
如果我没有“流”,我该如何复制这种行为?我的 getc() 和 gets() 从 INT32* 文件句柄中读取,我没有 puts() 或 putc() 等价物。
我只能用 fwrite() 写入,但这会改变 NV 内存上的内容。
感谢您的见解