[英]Reading a file line delimited by a comma using fgets and sscanf
編輯(更多信息):這部分代碼初始化結構。 它是全球性的。
struct csvVars
{
int timeStamp[500];
int xAccel[500];
int yAccel[500];
int zAccel[500];
int xGyro[500];
int yGyro[500];
int zGyro[500];
};
struct csvVars *userVars;
這是我發現用戶狀況的功能。 通過使用printf,我可以確定程序在sscanf部分崩潰了。
void userCondition()
{
FILE *csvFile = fopen("C:\\user.csv", "r");
if (csvFile == NULL)
{
printf("Error opening file ! \n");
return;
}
char line[100];
int i = 0, j;
double average;
double xAver = 0, yAver = 0, zAver = 0;
//skips first line
fgets (line, 100, csvFile);
fgets (line, 100, csvFile);
while(!feof(csvFile))
{
printf("111");
sscanf(line, "%d,%d,%d,%d,%d,%d,%d", &userVars->timeStamp[i], &userVars->xAccel[i], &userVars->yAccel[i], &userVars->zAccel[i], &userVars->xGyro[i], &userVars->yGyro[i], &userVars->zGyro[i]);
fgets (line, 100, csvFile);
i++;
}
for (j = 0; j < i; j++)
{
xAver += userVars->xAccel[j];
yAver += userVars->yAccel[j];
zAver += userVars->zAccel[j];
}
xAver = xAver/(i+1);
yAver = yAver/(i+1);
zAver = zAver/(i+1);
printf("%lf\n", xAver);
printf("%lf\n", yAver);
printf("%lf\n", zAver);
fclose(csvFile);
}
這是一個示例文件行:
11201,2614,2441,2300,1854,978,1370
解:
void userCondition()
{
FILE *csvFile = fopen("C:\\user.csv", "r");
char line[200];
int i = 0, j;
double xAver = 0, yAver = 0, zAver = 0;
struct csvVars userVars;
//skips first line
fgets (line, 100, csvFile);
fgets (line, 100, csvFile);
while(!feof(csvFile))
{
sscanf(line, "%d,%d,%d,%d,%d,%d,%d", &userVars.timeStamp[i], &userVars.xAccel[i], &userVars.yAccel[i], &userVars.zAccel[i], &userVars.xGyro[i], &userVars.yGyro[i], &userVars.zGyro[i]);
i++;
fgets (line, 100, csvFile);
}
for (j = 0; j < i; j++)
{
xAver += userVars.xAccel[j];
yAver += userVars.yAccel[j];
zAver += userVars.zAccel[j];
}
xAver = xAver/(i+1);
yAver = yAver/(i+1);
zAver = zAver/(i+1);
printf("%lf\n", xAver);
printf("%lf\n", yAver);
printf("%lf\n", zAver);
fclose(csvFile);
}
步驟1.變更:
sscanf(line, "%d,%d,%d,%d,%d,%d,%d", userVars->timeStamp[i], userVars->xAccel[i], userVars->yAccel[i], userVars->zAccel[i], userVars->xGyro[i], userVars->yGyro[i], userVars->zGyro[i]);
至:
sscanf(line, "%d,%d,%d,%d,%d,%d,%d", &userVars->timeStamp[i], &userVars->xAccel[i], &userVars->yAccel[i], &userVars->zAccel[i], &userVars->xGyro[i], userVars->yGyro[i], &userVars->zGyro[i]);
第2步。了解如何打開編譯器警告(例如gcc -Wall
),將其打開,並注意編譯器告訴您的所有內容。 在未啟用警告的情況下,切勿編譯。 這樣可以為您節省很多時間,避免出現此特定錯誤,並且將來會繼續為您節省很多時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.