我正在研究一种需要非常快速启动时间的行业安全产品。我试图遵循行业标准输出ASCII文件。为了加快这个文件格式化步骤,我使用#define' s在静态内存中创建了几个字符数组。这是一个小部分,例如:
#define COMTRADE_STATION_ID "Station Name,Device ID,1999\r\n"
#define COMTRADE_CHANNEL_COUNT "10,10A,0D\r\n"
#define COMTRADE_FREQUENCY "60\r\n"
#define COMTRADE_FILE_TYPE "BINARY\r\n1\r\n"
struct TS_ComtradeConfig
{
const char StationID[sizeof(COMTRADE_STATION_ID)];
const char ChannelCount[sizeof(COMTRADE_CHANNEL_COUNT)];
char Frequency[sizeof(COMTRADE_FREQUENCY)];
const char FileType[sizeof(COMTRADE_FILE_TYPE)];
};
TS_ComtradeConfig ConfigFile =
{
{COMTRADE_STATION_ID},
{COMTRADE_CHANNEL_COUNT},
{COMTRADE_FREQUENCY},
{COMTRADE_FILE_TYPE}
};
这是我用来打印出来的一些基本代码。
for(int nIndex = 0; nIndex < sizeof(ConfigFile); nIndex++)
{
printf("%c", ((char*)(ConfigFile.StationID))[nIndex]);
}
这适用于生成静态char数组,并且它可以很好地打印出整个ConfigFile,但是char数组是以null结尾的,这意味着最终结果不符合行业标准。似乎#define字符串由预处理器以空值终止。有没有办法解决?或者用于进行这种高速操作的任何其他方法?
答案 0 :(得分:3)
字符串连接怎么样:
#define COMTRADE_STATION_ID "Station Name,Device ID,1999\r\n"
#define COMTRADE_CHANNEL_COUNT "10,10A,0D\r\n"
#define COMTRADE_FREQUENCY "60\r\n"
#define COMTRADE_FILE_TYPE "BINARY\r\n1\r\n"
#define COMTRADE_ALL COMTRADE_STATION_ID COMTRADE_CHANNEL_COUNT COMTRADE_FREQUENCY COMTRADE_FILE_TYPE
// no struct, plain char array, no intervening nulls (but a trailing one)
char[sizeof(COMTRADE_ALL)] comTradeAll = COMTRADE_ALL;
答案 1 :(得分:2)
for(int nIndex = 0; nIndex < sizeof(ConfigFile); nIndex++) { printf("%c", ((char*)(ConfigFile.StationID))[nIndex]); }
我不知道您为什么要像char
char
那样将其打印出来。如果该结构中存在填充,则表示您遇到了麻烦。
为什么不直接遍历ConfigFile
和fwrite
成员呢?用以下代码替换整个循环:
// Add a -1 to the size to skip the \0
fwrite(ConfigFile.StationID, sizeof(ConfigFile.StationID) - 1, 1, stdout);
fwrite(ConfigFile.ChannelCount, sizeof(ConfigFile.ChannelCount) - 1, 1, stdout);
fwrite(ConfigFile.Frequency, sizeof(ConfigFile.Frequency) - 1, 1, stdout);
fwrite(ConfigFile.FileType, sizeof(ConfigFile.FileType) - , 1, stdout);
不仅代码更清晰(因为你没有做你奇怪的char指针黑客攻击),它会打印出你想要的东西。它也可能稍微更有效率,因为您没有要处理的格式化字符串(它只是进行数据转储)。