调用fopen时,C程序崩溃

时间:2018-05-11 23:52:19

标签: c crash

我是新来的,有一个我无法通过互联网搜索解决的问题。

当我再次打电话给fopen时,我的程序崩溃了。 只是一个小描述: 该程序逐行读取文件。这些线有两种可能的格式,这就是我必须区分它们的原因。当文件是格式时,对应于" else" -branch。该程序工作正常而不会崩溃。 然而,另一种格式会导致" if" -branch导致崩溃。 我希望源代码的部分对你们来说已经足够了。

    FILE *f = fopen("DATA.txt", "a+");
    for (int m = 0; m<listsize; m += 1) {
    .
    .
    .
    FILE *CSV = fopen(name, "r");
    FILE *pufferfile = fopen("puf.txt", "w+");        
    .
    .
    .
    char puffer[90];
    while (fgets(puffer, 90, CSV))
    {
        fputs(puffer, pufferfile);
        fseek(pufferfile, 0, SEEK_SET);
        if ((strstr(puffer, "\"")) != NULL) {
            fscanf(pufferfile, "%d,%d/%d/%d,%d:%d:%d,\"  %[^'\"]%s%*[ \"]%s  %[^'\"]%s  %[^'\"]%s\n", &row, &month, &day, &year, &hours, &minutes, &seconds, w_h, we, wj, w_t);
            fseek(pufferfile, 0, SEEK_SET);
            h_0 = atoi(w_h);
            h_0 += ((float)atoi(w_h + (strlen(w_h)) - 1) / (float)10);
            hum = h_0;
            t_0 = atoi(w_t);
            t_0 += ((float)atoi(w_t + (strlen(w_t)) - 1) / (float)10);
            temp = t_0;
        }
        else {
            fscanf(pufferfile, "%d,%d/%d/%d,%d:%d:%d,%f,%s\n", &row, &month, &day, &year, &hours, &minutes, &seconds, &hum, we);
            fseek(pufferfile, 0, SEEK_SET);
            t_1 = (int)we[4] - 48;
            t_2 = (int)we[5] - 48;
            t_0 = (int)we[7] - 48;
            if (we[6] == ',') {
                t_3 = 0;
            }
            else {
                t_3 = t_0;
            }
            temp = t_1 * 10 + t_2 + t_3 / 10;
        }
        fprintf(f, "      %02d.%02d.%d\t ;\t %02d:%02d:%02d\t ;\t    %.1f\t ;\t %.1f\n", day, month, year, hours, minutes, seconds, temp, hum);

    }
    fclose(CSV);
    fclose(pufferfile);
    remove(name);


}
remove("puf.txt");
fclose(f);

int index = 0;
FILE *woo = fopen("DATA_daily.txt", "w+"); //HERE it crashes

编辑:抱歉,我在代码中添加了几行代码,以便您更好地理解它。它不会直接在&#34; if&#34; -branch中崩溃。关键在于,如果程序读取以特定方式格式化的文件,则选择if-branch。不知何故,当它呼叫最后一个&#34; fopen(&#34; DATA_daily.txt&#34;,&#34; w +&#34;);&#34;时会崩溃。 相同的数据格式化了程序选择&#34;否则&#34; -branch不会导致崩溃的方式。 让我稍后解释一下。我有一个文件名的List(大小为lenghtsize)。 程序打开它,读取行并决定行的格式。 根据它,它读取值并将其放在另一个文件中(这里&#34; DATA.txt&#34;)。 程序崩溃后,我可以看到文件DATA.txt,它看起来很好。每一行都写在那里。

可能的2行格式如下:

1,4/4/2017,13:03:42,"  000028,9",       %RH,"  000023,1",  DEGREE C ---> resulting in the if-branch, causes crash
and
1,4/4/2017,13:03:42,28.9,       %RH,23.1,  DEGREE C  ---> resulting in the else branch, NO crash

1 个答案:

答案 0 :(得分:0)

我注意到你的代码在&#34; if&#34; branch不检查fscanf的返回值,这是第一个要修复的问题。例如:

rc = fscanf(...);
if ( rc != 11 )
{
  // handle error
}

接下来,我将检查你定义w_h和w_t的方式,并更改%s。我刚刚在MSDN页面上检查了scanf(),并警告你必须始终指定%s格式的宽度(例如,使用%32s),以避免缓冲区溢出。

我还要确保w_h和w_t在将它们作为参数传递给strlen或atoi之前是空终止的。例如:

char w_t[MAXLEN];
rc = fscanf(...);
if ( rc != 11 ) { /* handle error */ }
w_t[sizeof(w_t)-1] = '\0';
a = atoi(w_t);

但现在我注意到你写了

atoi(w_t + (strlen(w_t))

它不会做任何有用的事情,因为即使w_t成功地以null结尾,这也会将指向尾随空字节的指针传递给atoi。我不知道atoi将会做什么,但它可能会返回0.总是。

无论如何,这些是我要解决的第一件事。正如其他人所说,如果你使用调试器,你会得到更快的速度。或printfs。