从C中的文件读取值时的垃圾

时间:2018-01-09 07:59:10

标签: c file-handling

我正在尝试从名为" 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。

2 个答案:

答案 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_ROWSMAX_COLS的值。

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

int MAX_ROW = 31;
int MAX_COL = 19    

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