在不同位置打开文件会导致不同的结果

时间:2016-02-14 08:01:04

标签: c

test1.c:

int main(int argc, char *argv[])
{
    int n,m,q;
    scanf(" %d%d%d",&n,&m,&q);
    struct test_t test;
    FILE* fp = fopen("test.txt","rw");
    while (fscanf(fp,"%d%s%d%d%d%d%d%d%d%*d",&test.line,test.data,&test.number[0],&test.number[1],&test.number[2],&test.number[3],&test.number[4],&test.number[5],&test.number[6])!=EOF) {
            //do something....
    }
    return 0;
}

test2.c:

struct test_t {
    int line;
    char* data;
    int number[7];
};

test_t的定义:

141 2015-12-05 19 16 35 06 34 46 09 00
124 2015-12-08 49 25 10 09 40 48 32 00
143 2015-12-10 09 29 24 47 32 34 42 00

我的test.txt:

FILE* fp = fopen("test.txt","rw");

当我使用test1.c时,我得到分段错误。但是当我使用test2.c时,它运行良好。只改变{{1}}的行。造成这种差异的原因是什么。< / p>

2 个答案:

答案 0 :(得分:2)

您正在调用UB,因为您从未为char* data;分配内存。修正:

    malloc循环之前
  1. while足够的内存:

    test.data = malloc(32);
    if(!test.data)
    {
        fprintf(stderr, "malloc failed...Bailing out!\n");
        exit(-1);
    }
    

    使用后,

    free(test.data);
    
  2. 使用预定义大小的数组而不是指向char的指针:

    char data[32];
    
  3. 此外,作为@AshishAhuja said,还要检查fopen的返回值。

答案 1 :(得分:2)

好吧,当您从其他地方运行程序时,该位置很可能不存在该文件。因此,请检查fopen是否返回NULL。这样做:

FILE* fp = fopen("test.txt","rw");
if (fp == NULL) {
   printf ("Error, file does not exist\n");
   exit (1);
}

打开不存在的文件不是问题,因为fopen只会返回NULL。尝试读取或写入会导致分段错误以及核心转储。

此外,您永远不会为char *data分配内存,这可能会导致问题。要正确分配和免费,请参阅@CoolGuy's answer。