从 C 文件中读取值时出现垃圾

Garbage when reading values from file in C

我正在尝试从名为 "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,这导致打印了 1s。

另一行示例输入(更新了正确的行数和列数):

垃圾示例行:

1027102743384832642021664202164338483243385024435158484338502443385024204743515856433848326420672433848322008298648435158560  

但是我已经在 fscanf 部分之前将数组的每个元素的值设置为 1,所以垃圾现在只有 31 行,每行 19 1s。

根本原因(由 OP 确认)是损坏的文件,损坏如 "empty"。
这应该通过错误检查来处理,如建议的那样。 David、一些程序员老兄和 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 的证实。)

你的代码逻辑是正确的,但是如果是你写的所有代码那么你必须指定MAX_ROWSMAX_COLS的值。

此外,由于您使用的是 CSV 文件,因此请使用 NULL 填充所有空值。

int MAX_ROW = 31;
int MAX_COL = 19    

由于 csv 文件中的限制和空值,正在生成垃圾。