我正在尝试从名为" CRIMES_Data.csv"的文件中读取值。我尝试打印读取的值并获得垃圾。我检查了问题所在的位置,结果发现它根本没有读取文件中的值。
int i, j, RAW_DATA[MAX_ROWS][MAX_COLS];
FILE *fp;
fp = fopen("CRIMES_Data.csv", "r");
for (i=0; i<MAX_ROWS; i++) {
for (j=0; j<MAX_COLS-1; j++) {
fscanf(fp, "%d,", &RAW_DATA[i][j]);
}
fscanf(fp, "%d\n", &RAW_DATA[i][j]);
}
我没有正确打开文件,或者我试图读取值的方式有问题吗?我是新手,之前没有使用过文件。
该文件有31行和19列。 示例行:
16,18,6,24,16,18,13,12,14,12,8,3,15,6,16,13,9,19,11
6,7,8,10,14,13,8,8,5,12,4,4,8,6,6,7,6,6,7
我尝试使用
进行打印for(i=0;i<MAX_ROWS;i++){
for(j=0; j<MAX_COLS;j++){
printf("%d", RAW_DATA[i][j]);
}
printf("\n");
}
确保在我开始下一个任务之前正确读取了值。 由于它打印了垃圾,我在fscanf循环之前将每个值设置为1,结果打印出1。
另一行示例输入(更新了正确的行数和列数):
垃圾的一个示例行:
1027102743384832642021664202164338483243385024435158484338502443385024204743515856433848326420672433848322008298648435158560
但是我已经在1
部分之前将数组的每个元素的值设置为fscanf
,因此垃圾现在只有31行19 1
s。
答案 0 :(得分:2)
根本原因(由OP确认)是一个损坏的文件,已损坏,如&#34;空&#34;。
这应该通过错误检查来处理,如大卫,一些程序员Dude和Jonathan。
即。添加以下编辑,以避免将来出现类似问题。
if (!fp)
{
perror ("CRIMES_Data.csv"); return 1;
/* not triggered by successfully opening an empty file though... */
}
和
read=fscanf(...);
/* do a plausibility check on the return value, e.g. that it is 1, the number of successfully read arguments */
按照Jonathan的建议处理新行。
此外,MAX_COLS == 18,此循环
for (j=0; j<MAX_COLS-1; j++)
将读取17列,循环后读取另一列,总共18列 你的文件应该有19列。在单个fscanf之后,输入流将因此处于与您预期不同的状态。 (这也是OP确认的。)
答案 1 :(得分:0)
您的代码逻辑是正确的,但如果它是您编写的所有代码,则必须指定MAX_ROWS
和MAX_COLS
的值。
此外,由于您使用的是CSV文件,因此使用NULL
填充所有空值。
int MAX_ROW = 31;
int MAX_COL = 19
由于csv文件中的限制和空值,正在生成垃圾。