首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使char缓冲区充当文件?

如何使char缓冲区充当文件?
EN

Stack Overflow用户
提问于 2014-07-10 09:44:00
回答 2查看 247关注 0票数 1

我在转换文件中的char缓冲区时遇到了问题*(当然,如果这是可能的话!)我有一个枚举定义为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef enum SchemaType{
 SCHEMA_INT,
 SCHEMA_REAL,
 SCHEMA_STRING,
 SCHEMA_BOOLEAN,
 SCHEMA_CHAR,
 SCHEMA_SIMPLE,
 SCHEMA_RECORD,
 SCHEMA_ARRAY
} SchemaType;

我有一个功能完美的函数,它输出枚举本身(用于调试):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void printSchemaType(FILE* f,SchemaType schemaType){
 switch (schemaType){
  case SCHEMA_INT: fprintf(f,"int"); break;
  case SCHEMA_ARRAY: fprintf(f,"array"); break;
  case SCHEMA_BOOLEAN: fprintf(f,"boolean"); break;
  case SCHEMA_CHAR: fprintf(f,"char"); break;
  case SCHEMA_REAL: fprintf(f,"real"); break;
  case SCHEMA_RECORD: fprintf(f,"record"); break;
  case SCHEMA_STRING: fprintf(f,"string"); break;
 }
}

现在的问题是:我需要使用fprintf打印出来的字符串(即"int“、"char”、“the”、“ex cetera”)作为散列表中的键;为此,我希望将打印出来的printSchemaType()字符串存储在变量中,也许可以使用sprintf:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char buffer[25];
sprintf(buffer,"%s",printSchemaType_output);

问题是,我需要在变量中获得函数输出!我知道我可以:

  • 用开关创建一个新的函数storeSchemaTypeInsideBuffer(const char* buffer,SchemaType type); ..。情况,但我不喜欢,因为我不想要这样的小事情多余的代码;
  • 将" printSchemaType“的原型转换为void printSchemaType(const char* buffer,SchemaType schemaType),但我不喜欢这样做,因为还有其他函数,比如printSchemaType和一个相似的原型(printTYPE(FILE* f, TYPE typevariable)),而改变它的原型会在这个唯一的函数和其他的函数之间创建一个不同的原型;

我正在考虑的解决方案是将char缓冲区转换为一个文件*变量:这样我就可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SchemaType=SCHEMA_INT;
char buffer[25];
FILE* bufferActingAsAFile=make_buffer_acts_as_a_File(buffer);
fprintf(bufferActingAsAFile,type); //now in the buffer there is stored "int"

在C语言中这样的事情可能发生吗?如果是的话,我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-10 10:08:24

不是您要求的,但我会重写您的printSchemaType函数。

创建一个名为SchemaTypeStr (或其他适合您的命名方案的名称)的新函数,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const char* SchemaTypeStr(enum SchemaType type) {
    switch(type) {
        case SCHEMA_INT:     return "int"; break;
        case SCHEMA_ARRAY:   return "array"; break;
        case SCHEMA_BOOLEAN: return "boolean"; break;
        case SCHEMA_CHAR:    return "char"; break;
        case SCHEMA_REAL:    return "real"; break;
        case SCHEMA_RECORD:  return "record"; break;
        case SCHEMA_STRING:  return "string"; break;
        default: abort();
    }
}

void printSchemaType(FILE* f,SchemaType schemaType) {
    fputs(SchemaTypeStr(schemaType), f);
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-10 09:49:05

似乎没有一个可移植的解决方案。对于linux,您可以使用fmemopen,但是对于Windows,您需要使用CreateFile、CreateFileMapping和MapViewOfFile。

参见类似的问题这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24683052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文