我是新来的,有一个我无法通过互联网搜索解决的问题。
当我再次打电话给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
答案 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。