C++ 访问冲突读取

C++ 访问冲突读取,c++,runtime-error,buffer,access-violation,C++,Runtime Error,Buffer,Access Violation,我需要帮助解决这个问题。我不断地发现这个错误: XXXXX.exe中0x798F2489(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0x00F30000 基本逻辑是我从“服务器”接收一些数据并将其写入文件 程序在这一行dValue=((双)缓冲区)停止 for(int j=0;j打印数据(文件,FileBuf); 缓冲区+=(strlen(PointName)+1); //检查下一个字节是int还是double 如果(strcmp(PointName,“Lev

我需要帮助解决这个问题。我不断地发现这个错误:

XXXXX.exe中0x798F2489(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0x00F30000

基本逻辑是我从“服务器”接收一些数据并将其写入文件

程序在这一行dValue=((双)缓冲区)停止

for(int j=0;j打印数据(文件,FileBuf);
缓冲区+=(strlen(PointName)+1);
//检查下一个字节是int还是double
如果(strcmp(PointName,“Level”)==0 | | strcmp(PointName,“Acid on output”)==0){
iValue=*((int*)缓冲区);
sprintf_s(FileBuf,“%d%%\r\n”,iValue);
此->打印数据(文件,FileBuf);
buffer+=4;//移动点(int size)位置
}
否则{
dValue=*((双*)缓冲区);//----此处发生错误!
}
整个功能是:

int PlantLogger::WriteFile(fstream* file, char* buf, int length){
struct pkg
{
    int length;
    int numberOfChannels;
    char data[1024];
};
pkg* Package = (pkg*)buf;

if (Package->length != length) {
    return 1;
}

char FileBuf[2048];

// Get the current time
time_t CurrentTime;
time(&CurrentTime);
struct tm* MyTime = localtime(&CurrentTime);

// Format the time
char TimeBuf[24];
strftime(TimeBuf, 24, "%d-%m-%Y %H:%M:%S", MyTime);

// Write time to file buffer
sprintf_s(FileBuf, "\r\nMeasurement results at %s\r\n", TimeBuf);

this->printData(file, FileBuf);

char* buffer = Package->data;
char* ChannelName = { 0 };

for (int i = 0; i < Package->numberOfChannels; i++) {
    int NumberOfPoints = *((int*)buffer);
    buffer += 4;
    ChannelName = buffer;
    sprintf_s(FileBuf, "%s:\r\n", ChannelName);
    this->printData(file, FileBuf);
    buffer += (strlen(ChannelName) + 1);

    char* PointName = { 0 };
    int iValue = 0;
    double dValue = 0.0;

    for (int j = 0; j < NumberOfPoints; j++) {
        PointName = buffer;
        sprintf_s(FileBuf, "%s: ", PointName);
        // print
        this->printData(file, FileBuf);
        buffer += (strlen(PointName) + 1);

        // check if next byte is int or double
        if (strcmp(PointName, "Level") == 0 || strcmp(PointName, "Acid on output") == 0) {
            iValue = *((int*)buffer);
            sprintf_s(FileBuf, "%d%%\r\n", iValue);
            this->printData(file, FileBuf);
            buffer += 4; // move the point (int size) places
        }
        else {
            dValue = *((double*)buffer);
        }

        if (strcmp(PointName, "Flow speed") == 0 || strcmp(PointName, "Input solution flow") == 0) {
            sprintf_s(FileBuf, "%.1f\xB0\x43\r\n", dValue);
        }
        if (strcmp(PointName, "Temperature") == 0 || strcmp(PointName, "Output Temperature") == 0) {
            sprintf_s(FileBuf, "%.1fatm\r\n", dValue);
        }
        if (strcmp(PointName, "Pressure") == 0 || strcmp(PointName, "Output pressure") == 0) {
            sprintf_s(FileBuf, "%.1f\r\n", dValue);
        }
        if (strcmp(PointName, "PH") == 0) {
            sprintf_s(FileBuf, "%.1f\r\n", dValue);
        }
        if (strcmp(PointName, "Concentration") == 0) {
            sprintf_s(FileBuf, "%p\r\n", dValue);
        }
        if (strcmp(PointName, "Input flow") == 0) {
            sprintf_s(FileBuf, "%.3fm3/s\r\n", dValue);
        }
        if (strcmp(PointName, "Disulfid on Output") == 0) {
            sprintf_s(FileBuf, "%p/s\r\n", dValue);
        }

        this->printData(file, FileBuf);
        buffer += 8; // move the point (double size) places
    }
}
return 0;}
int PlantLogger::WriteFile(fstream*文件,char*buf,int-length){
结构包
{
整数长度;
国际数字频道;
字符数据[1024];
};
包装*包装=(包装*)buf;
如果(包->长度!=长度){
返回1;
}
char FileBuf[2048];
//获取当前时间
时间-当前时间;
时间(&CurrentTime);
struct tm*MyTime=localtime(&CurrentTime);
//安排时间
char-TimeBuf[24];
strftime(TimeBuf,24,“%d-%m-%Y%H:%m:%S”,MyTime);
//写入文件缓冲区的时间
sprintf_s(FileBuf,“\r\n在%s的测量结果\r\n”,TimeBuf);
此->打印数据(文件,FileBuf);
char*buffer=包->数据;
char*ChannelName={0};
对于(int i=0;inumberOfChannels;i++){
int NumberOfPoints=*((int*)缓冲区);
缓冲区+=4;
ChannelName=缓冲区;
sprintf_s(FileBuf,“%s:\r\n”,ChannelName);
此->打印数据(文件,FileBuf);
缓冲区+=(strlen(ChannelName)+1);
char*PointName={0};
int-iValue=0;
双D值=0.0;
对于(int j=0;j打印数据(文件,FileBuf);
缓冲区+=(strlen(PointName)+1);
//检查下一个字节是int还是double
如果(strcmp(PointName,“Level”)==0 | | strcmp(PointName,“Acid on output”)==0){
iValue=*((int*)缓冲区);
sprintf_s(FileBuf,“%d%%\r\n”,iValue);
此->打印数据(文件,FileBuf);
buffer+=4;//移动点(int size)位置
}
否则{
d值=*((双*)缓冲区);
}
if(strcmp(点名称,“流动速度”)==0 | | strcmp(点名称,“输入溶液流动”)==0){
sprintf_s(FileBuf,“%.1f\xB0\x43\r\n”,d值);
}
如果(strcmp(PointName,“温度”)==0 | | strcmp(PointName,“输出温度”)==0){
sprintf_s(FileBuf,“%.1fatm\r\n”,d值);
}
如果(strcmp(点名称,“压力”)==0 | | strcmp(点名称,“输出压力”)==0){
sprintf_s(FileBuf,“%.1f\r\n”,d值);
}
if(strcmp(点名称,“PH”)==0){
sprintf_s(FileBuf,“%.1f\r\n”,d值);
}
如果(strcmp(点名称,“浓度”)==0){
sprintf_s(FileBuf,“%p\r\n”,dValue);
}
if(strcmp(点名称,“输入流”)==0){
sprintf_s(FileBuf,“%.3fm3/s\r\n”,d值);
}
if(strcmp(PointName,“输出上的二硫化物”)==0){
sprintf_s(FileBuf,“%p/s\r\n”,d值);
}
此->打印数据(文件,FileBuf);
缓冲区+=8;//移动点(两倍大小)的位置
}
}
返回0;}

什么是
缓冲区
?您需要制作一个最小的完整的可验证示例。首先,这不是编译错误;这是运行时错误,因此您将文章标记错误。其次,“当我尝试将字符解析为双精度时”-您不是在“解析”任何东西,更不用说双重
double
。相反,你把
buffer
的内存背景当作包含一个平台
double
值,并假设它足够对齐,可以从内存中读取该值。最后,你的帖子应该有一个,强调最小但完整的。它应该包含我们可以n编译、运行并提供任何所需的输入数据(这也是您问题的一部分)以避免错误。猜测您的缓冲区数据没有正确的尾数,从而导致
NumberOfPoints
的值比您预期的值大得多。请提供
int PlantLogger::WriteFile(fstream* file, char* buf, int length){
struct pkg
{
    int length;
    int numberOfChannels;
    char data[1024];
};
pkg* Package = (pkg*)buf;

if (Package->length != length) {
    return 1;
}

char FileBuf[2048];

// Get the current time
time_t CurrentTime;
time(&CurrentTime);
struct tm* MyTime = localtime(&CurrentTime);

// Format the time
char TimeBuf[24];
strftime(TimeBuf, 24, "%d-%m-%Y %H:%M:%S", MyTime);

// Write time to file buffer
sprintf_s(FileBuf, "\r\nMeasurement results at %s\r\n", TimeBuf);

this->printData(file, FileBuf);

char* buffer = Package->data;
char* ChannelName = { 0 };

for (int i = 0; i < Package->numberOfChannels; i++) {
    int NumberOfPoints = *((int*)buffer);
    buffer += 4;
    ChannelName = buffer;
    sprintf_s(FileBuf, "%s:\r\n", ChannelName);
    this->printData(file, FileBuf);
    buffer += (strlen(ChannelName) + 1);

    char* PointName = { 0 };
    int iValue = 0;
    double dValue = 0.0;

    for (int j = 0; j < NumberOfPoints; j++) {
        PointName = buffer;
        sprintf_s(FileBuf, "%s: ", PointName);
        // print
        this->printData(file, FileBuf);
        buffer += (strlen(PointName) + 1);

        // check if next byte is int or double
        if (strcmp(PointName, "Level") == 0 || strcmp(PointName, "Acid on output") == 0) {
            iValue = *((int*)buffer);
            sprintf_s(FileBuf, "%d%%\r\n", iValue);
            this->printData(file, FileBuf);
            buffer += 4; // move the point (int size) places
        }
        else {
            dValue = *((double*)buffer);
        }

        if (strcmp(PointName, "Flow speed") == 0 || strcmp(PointName, "Input solution flow") == 0) {
            sprintf_s(FileBuf, "%.1f\xB0\x43\r\n", dValue);
        }
        if (strcmp(PointName, "Temperature") == 0 || strcmp(PointName, "Output Temperature") == 0) {
            sprintf_s(FileBuf, "%.1fatm\r\n", dValue);
        }
        if (strcmp(PointName, "Pressure") == 0 || strcmp(PointName, "Output pressure") == 0) {
            sprintf_s(FileBuf, "%.1f\r\n", dValue);
        }
        if (strcmp(PointName, "PH") == 0) {
            sprintf_s(FileBuf, "%.1f\r\n", dValue);
        }
        if (strcmp(PointName, "Concentration") == 0) {
            sprintf_s(FileBuf, "%p\r\n", dValue);
        }
        if (strcmp(PointName, "Input flow") == 0) {
            sprintf_s(FileBuf, "%.3fm3/s\r\n", dValue);
        }
        if (strcmp(PointName, "Disulfid on Output") == 0) {
            sprintf_s(FileBuf, "%p/s\r\n", dValue);
        }

        this->printData(file, FileBuf);
        buffer += 8; // move the point (double size) places
    }
}
return 0;}