我正在嘗試列印從 Excel 中的 CSV 檔案讀取的結構陣列。但是,只列印學生證;還列印了其他資訊,但一些令人困惑的稀有字符。你能告訴我這段代碼有什么問題嗎?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student {
char ID[8];
char name[32];
int score;
} student;
int main(int argc, char *argv[]) {
student student_list[100];
FILE *source = fopen("students.csv", "r");
if (source == NULL) {
perror("Unable to open the source file.");
exit(1);
}
char buffer[1024];
fgets(buffer, sizeof(buffer), source);
int num_student = 0;
while (!feof(source)) {
student *one_student = student_list num_student;
sscanf(buffer, "%8[^,] 2[^,] %3[^,]",
&one_student->ID, &one_student->name, &one_student->score);
fgets(buffer, sizeof(buffer), source);
num_student ;
}
for (int i = 0; i < num_student; i ) {
printf("ID: %s name: %-9s score: %-3d\n",
student_list[i].ID, student_list[i].name, student_list[i].score);
}
fclose(source);
return 0;
}
這是一個示例輸入檔案students.csv:
B213350,John Adam Smith,80
B191835,Mary Elizabeth Smith,71
B201304,Yamazaki Fuyumi,95
B201832,Liam,57
B201834,Alfonso Hernández,65
uj5u.com熱心網友回復:
有多個問題:
你不應該使用
feof(). 閱讀為什么“while (!feof (file))”總是錯誤的?
請改用此回圈:while (fgets(buffer, sizeof buffer, source)) { // handle the line }格式字串不
sscanf()正確:字符數太大并且,缺少。它應該是" %7[^,\n], 1[^,\n], %d"并且您應該檢查回傳值是否為 3,即預期的成功轉換次數。當學生陣列已滿時,您應該停止。
這是修改后的版本:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student {
char ID[8];
char name[32];
int score;
} student;
int main(int argc, char *argv[]) {
student student_list[100];
FILE *source = fopen("students.csv", "r");
if (source == NULL) {
fprintf(stderr, "Cannot open file students.csv: %s\n", strerror(errno));
return 1;
}
char buffer[1024];
int num_student = 0;
while (num_student < 100 && fgets(buffer, sizeof(buffer), source)) {
student *one_student = &student_list[num_student];
if (sscanf(buffer, " %7[^,\n], 1[^,\n], %d",
one_student->ID, one_student->name,
&one_student->score) == 3) {
num_student ;
} else {
printf("invalid CSV line: %s", buffer);
}
}
for (int i = 0; i < num_student; i ) {
printf("ID: %-9s name: %-32s score: %-3d\n",
student_list[i].ID, student_list[i].name,
student_list[i].score);
}
fclose(source);
return 0;
}
請注意,這種決議 CSV 檔案的方法無法處理空欄位。決議該行strtok()也不起作用,因為連續的逗號將作為單個分隔符處理。您需要使用不同的方法strcspn()or strchr()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475882.html
上一篇:從路徑讀取多個CSV檔案
