从 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 1
s。
根本原因(由 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_ROWS
和MAX_COLS
的值。
此外,由于您使用的是 CSV 文件,因此请使用 NULL
填充所有空值。
int MAX_ROW = 31;
int MAX_COL = 19
由于 csv 文件中的限制和空值,正在生成垃圾。
我正在尝试从名为 "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 1
s。
根本原因(由 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_ROWS
和MAX_COLS
的值。
此外,由于您使用的是 CSV 文件,因此请使用 NULL
填充所有空值。
int MAX_ROW = 31;
int MAX_COL = 19
由于 csv 文件中的限制和空值,正在生成垃圾。