C++ 将数据写入新文件时发生异常

C++ 将数据写入新文件时发生异常,c++,c,fwrite,yuv,C++,C,Fwrite,Yuv,我的任务是读取一个yuv文件,然后对它的每个组件(Y、Cb、Cr)添加一些数据并将其存储到另一个文件中。我尝试了以下代码: #include <stdio.h> #include <stdlib.h> void main() { FILE *fp=fopen("traffic_1920x1080.yuv","rb"); FILE *myYUV=fopen("traffic_1920x1088.yuv","ab"); int count=0;

我的任务是读取一个yuv文件,然后对它的每个组件(Y、Cb、Cr)添加一些数据并将其存储到另一个文件中。我尝试了以下代码:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    FILE *fp=fopen("traffic_1920x1080.yuv","rb");
    FILE *myYUV=fopen("traffic_1920x1088.yuv","ab");
    int count=0;
    unsigned char *y=(unsigned char*)malloc(sizeof(unsigned char)*1920*1080);
    unsigned char *u=(unsigned char*)malloc(sizeof(unsigned char)*(1920/2)*(1080/2));
    unsigned char *v=(unsigned char*)malloc(sizeof(unsigned char)*(1920/2)*(1080/2));

    unsigned char ypad[1920*8];
    unsigned char upad[(1920/2)*4];
    unsigned char vpad[(1920/2)*4];

    for(int i=0;i<(1920/2)*4;i++)
    {
        ypad[i]=255;
        upad[i]=128;
        vpad[i]=128;
    }
    for(int i=(1920/2)*4;i<1920*8;i++)
        ypad[i]=255;
    while (!feof(fp))
    {
        fread(y,sizeof(unsigned char),1920*1080,fp);
        fread(u,sizeof(unsigned char),1920/2*1080/2,fp);
        fread(v,sizeof(unsigned char),1920/2*1080/2,fp);

        fwrite(y, sizeof(unsigned char),1920*1080,myYUV);
        fwrite(ypad,sizeof(unsigned char),1920*8,myYUV);

        fwrite(u,sizeof(unsigned char),1920/2*1080/2,myYUV);
        fwrite(upad,sizeof(unsigned char),1920/2*4,myYUV);

        fwrite(v,sizeof(unsigned char),1920/2*1080/2,myYUV);
        fwrite(vpad,sizeof(unsigned char),1920/2*4,myYUV);

        printf("Frame %d created\r",count);
        y+=1920*1080;
        u+=1920/2*1080/2;
        v+=1920/2*1080/2;
        count ++;
    }
    free(y);
    free(u);
    free(v);

    fclose(fp);
    fclose(myYUV);
}
在第
fwrite行(y,sizeof(无符号字符),1920*1080,myYUV)

这是指针增量中的问题吗?还是别的什么?请回复。提前感谢。

这些增量:

y+=1920*1080;
u+=1920/2*1080/2;
v+=1920/2*1080/2;
将递增指针,使其超过分配内存的末尾。例如,
y
指向分配内存的1920*1080字节的开始。把它增加那么多,它就超过了记忆的终点。这会导致对未分配内存进行读/写操作。这就是为什么你会遇到访问冲突

实际上,我看不出有什么理由要增加这些指针

除此之外,您的代码应该检查错误条件(fopen()是否成功等)

这些增量:

y+=1920*1080;
u+=1920/2*1080/2;
v+=1920/2*1080/2;
将递增指针,使其超过分配内存的末尾。例如,
y
指向分配内存的1920*1080字节的开始。把它增加那么多,它就超过了记忆的终点。这会导致对未分配内存进行读/写操作。这就是为什么你会遇到访问冲突

实际上,我看不出有什么理由要增加这些指针



除此之外,您的代码应该检查错误情况(fopen()是否成功,等等)

在fopen之后,您应该始终检查结果指针是否为空。请检查myYUV open是否成功。但是,如果文件指针为空,则它甚至不会通过一个循环。检查空值只是一个预先警告措施。是,myYUV已成功打开。在第一个循环中,它写入了3129344字节,您希望
y
y+=1920*1080之后指向哪里?在fopen之后,您应该始终检查结果指针是否为空。请检查myYUV open是否成功。但是,如果文件指针为空,则它甚至不会通过一个循环。检查空值只是一个预先警告措施。是,myYUV已成功打开。在第一个循环中,它写入了3129344字节,您希望
y
y+=1920*1080之后指向哪里?每次我读取1920*1080字节并将它们写入myYUV,为了访问下一组数据,我应该增加y ptr。如果我错了,请纠正我。好吧,那么你需要一个更大的缓冲区,因为你第一次递增时,你已经超过了你留出的缓冲区的末尾。@Zax这有什么作用?您将数据写入一个文件,然后在旧文件上读取新数据(由于已经写入该文件,因此不再需要旧数据)。没有理由增加指针。正如您看到的代码所示,每次从y、u、v写入后,我都会在新文件中填充额外的数据。我的目的是将一个分辨率为1920x1080的文件设置为1920x1088。@Zax您确定需要一个while循环吗?在每个循环中,您都在读写完整的图像。如果只有一个图像,则根本不需要循环。如果您确实有多个图像,但仍然需要旧图像,请分配更多内存。但是您的代码表明不需要旧数据,因此不需要增加指针。每次我读取1920*1080字节并将它们写入myYUV,为了访问下一组数据,我应该增加y ptr。如果我错了,请纠正我。好吧,那么你需要一个更大的缓冲区,因为你第一次递增时,你已经超过了你留出的缓冲区的末尾。@Zax这有什么作用?您将数据写入一个文件,然后在旧文件上读取新数据(由于已经写入该文件,因此不再需要旧数据)。没有理由增加指针。正如您看到的代码所示,每次从y、u、v写入后,我都会在新文件中填充额外的数据。我的目的是将一个分辨率为1920x1080的文件设置为1920x1088。@Zax您确定需要一个while循环吗?在每个循环中,您都在读写完整的图像。如果只有一个图像,则根本不需要循环。如果您确实有多个图像,但仍然需要旧图像,请分配更多内存。但是您的代码表明不需要旧数据,因此不需要增加指针。