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

时间:2014-07-10 17:44:00

标签: c

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

typedef enum SchemaType{
 SCHEMA_INT,
 SCHEMA_REAL,
 SCHEMA_STRING,
 SCHEMA_BOOLEAN,
 SCHEMA_CHAR,
 SCHEMA_SIMPLE,
 SCHEMA_RECORD,
 SCHEMA_ARRAY
} SchemaType;

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

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”,“real”,ex cetera)作为散列表中的键;为此,我想将printSchemaType()的打印字符串存储在变量中,也许使用sprintf:

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缓冲区转换为FILE *变量:这样我就能做到这样的事情:

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中是否可能?如果是,我该怎么做?

2 个答案:

答案 0 :(得分:1)

不是你要求的,但我会改写你的printSchemaType功能。

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

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 :(得分:0)

似乎不是便携式解决方案。对于linux,您可以使用fmemopen,但对于Windows,您需要使用CreateFile,CreateFileMapping和MapViewOfFile。

查看类似问题here