如何在C中使用fopen

时间:2014-02-20 10:48:00

标签: c fopen

我在c。

中使用fopen()时遇到问题

当我编译并运行它时:

const char* mode="r";
FILE* imgstream = fopen(pathinput, mode);

我收到了分段错误:

main called
argv[1]: /home/student/workspace/Flip/res/test.pbm
open mode: r
./testscript: line 6: 12454 Segmentation fault      ./flippr /home/student/workspace/Flip/res/test.pbm /home/student/workspace/Flip/test_out.pbm

在我看来它应该正常工作...... 我做错了什么?

main.c的整个代码:

#include "flip.h"
#include "img.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int pbm_image_flip(PbmImage* image){
    return 0;
}

int main(int argc, char **argv) {
#ifdef DEBUG
    printf("main called\n");
#endif
    int* error=RET_PBM_OK;

#ifdef DEBUG
    printf("argv[1]: %s\n", argv[1]);
#endif

    const char* mode="r";
#ifdef DEBUG
    printf("open mode: %s\n", mode);
#endif
    FILE* imgstream = fopen(argv[1], mode);
#ifdef DEBUG
    printf("imgstream fopen");
#endif
    PbmImage* pbmimage=pbm_image_load_from_stream(imgstream, error);

    pbm_image_flip(pbmimage);

    return 0;
}

代码运行直到我尝试打开流之前。

2 个答案:

答案 0 :(得分:3)

错误来自这一行:

const char* mode='r';

C中的单引号和双引号之间存在差异。单个字符用于字符,双字符串用于字符串文字(可以安全地分配给char*

你的解决方案是

FILE* imgstream = fopen(pathinput,"r");

答案 1 :(得分:1)

还有一个问题:

int* error = RET_PBM_OK;

会崩溃或稍后会导致崩溃。您正在使用未初始化的指针。

写下这个:

int error = RET_PBM_OK ;
...
PbmImage* pbmimage=pbm_image_load_from_stream(imgstream, &error);

但这是不好的做法。通常pbm_image_load_from_stream如果成功,则负责设置RET_PBM_OK的错误。在这种情况下,您甚至无需在致电error之前初始化pbm_image_load_from_stream