【问题标题】:CS50 pset4 recover: Seg-fault in fwrite functionCS50 pset4 恢复:fwrite 函数中的 Seg-fault
【发布时间】:2020-07-17 23:52:40
【问题描述】:

每当我运行程序时都会发生分段错误。使用 printf 函数,我缩小了在第二个 while 循环的第一次迭代中代码 fwrite(buffer, sizeof(BYTE), block, output) 的最后一行代码中的 fwrite 函数中发生的段错误。我已经尝试了很多东西,但我无法让段错误消失。知道可能导致此问题的原因以及如何解决此问题吗?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <cs50.h>
#include <string.h>

typedef uint8_t BYTE;

const int block = 512;

int main(int argc, char *argv[])
{
if (argc != 2)
{
    printf("Usage: ./recover card.raw");
    return 1;
}

//open file for reading
char *infile = argv[1];
FILE *file = fopen(infile, "r");

if (file == NULL)
{
    printf("Error while opening file");
    return 1;
}
//initializing
BYTE buffer[block];
memset(buffer, 0x00, block);
BYTE x = 0;
memset(&x, 0x00, 1);
BYTE JPEG[3] = {0xff, 0xd8, 0xff};
char filename[8];
int imagecount = 0;

//open file output for writing
FILE* output = NULL;
output = fopen("000.jpg", "w");
while (1)
{
    fread(&x, sizeof(BYTE), 1, file);
    if (x == JPEG[0])
    {
        fread(&x, sizeof(BYTE), 1, file);
        if (x == JPEG[1])
        {
            fread(&x, sizeof(BYTE), 1, file);
            if (x == JPEG[2])
            {
                fread(&x, sizeof(BYTE), 1, file);
                int y = (int) x;
                if ((y >= 224) && (y <= 239))
                {
                    break;
                }
            }
        }
    }
}
fwrite(JPEG, sizeof(BYTE), 3, output);
fwrite(&x, sizeof(BYTE), 1, output);
fread(output, sizeof(BYTE), block - 4, file);
while (1)
{
    int n = fread(&buffer, sizeof(BYTE), block, file);
    if (n == 0)
    {
        break;
    }
    if (buffer[0] == JPEG[0] && buffer[1] == JPEG[1] && buffer[2] == JPEG[2] && output != NULL)
    {
        fclose(output);
        imagecount++;
        sprintf(filename, "%03i.jpg", imagecount);
        output = fopen(filename, "w");
    }
    printf("z");
    fwrite(buffer, sizeof(BYTE), block, output);
    printf("z");
}
}

【问题讨论】:

    标签: c segmentation-fault cs50


    【解决方案1】:

    你正在做一个fread(output,...,...,file)

    也就是说,您正在读入一个缓冲区,该缓冲区是您的output FILE 描述符。可能不是你想要的......

    请注意,fread 的第一个参数是 void * 指针,因此很高兴接受它(即没有编译错误)。

    换句话说,你在垃圾FILE *output指向的东西。

    【讨论】:

    • 非常感谢!段错误现在消失了,程序运行良好。我仍然不明白为什么我不能使用 fread 直接从文件复制到输出中。请原谅我对 fread 函数缺乏了解,我对编程很陌生。
    • 模型是fread/fwrite,它接受流指针、缓冲区指针和长度。同样对于系统调用read/write [这是更快]。这对于大多数想要:read, do some processing on data, output _modified_ data 的应用程序来说通常就足够了。那是常态。但是,对于文件的超高速复制,有一个sendfile 系统调用[或copy_file_range]。这可能是你正在考虑的。但是,大多数时候,单独的read 然后write 更通用/更灵活。而且,通常,相当快。可能,限制因素是磁盘速度,所以没有争议
    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2020-08-02
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多