【问题标题】:Garbage when reading values from file in C [closed]从C中的文件读取值时出现垃圾[关闭]
【发布时间】:2018-01-09 07:59:09
【问题描述】:

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

【问题讨论】:

  • 您的RAW_DATA 声明在哪里?你检查过fp != NULL吗? CRIMES_Data.csv 的一部分是什么样的?
  • 在你得到垃圾的地方打印代码也是值得的。错误可能在那里。
  • 我的赌注是fp = fopen("CRIMES_Data.csv", "r"); 失败了。 if (!fp) { perror ("CRIMES_Data.csv"); return 1; }
  • 更多关于您的问题,或者更确切地说是您的问题,请read about how to ask good questions。然后编辑问题以改进它。例如,向我们展示文件的一些示例内容。并告诉我们更多关于您显示的代码是如何失败的,以及您尝试对debug your code 执行的操作。看到Minimal, Complete, and Verifiable Example 也很好。
  • 只是一个快速的建议;我实际上很确定这是礼仪,但请不要编辑您的问题的答案;写一个答案,而不是。作为一名编程学生,我相信你很快就会发现这种结构的价值,即使是在潜意识层面,尽管如果你有意识地学习搜索引擎优化,它会更加牢固......

标签: c file-handling


【解决方案1】:

根本原因(由 OP 确认)是一个损坏的文件,损坏为“空”。
这应该通过错误检查来处理,例如推荐的。 David、Some Programmer 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 的证实。)

【讨论】:

  • 我确实添加了 David 的代码行,但它没有产生错误。我不熟悉在 C 中使用文件,所以无法说明为什么会发生这种情况。
  • 打开现有文件会成功,并且不会触发 David 建议的检查,即使它是空的。但是,读取某些内容会失败并且不会写入变量,这解释了您的问题。
  • 谢谢您的解释
【解决方案2】:

您的代码逻辑是正确的,但如果是您编写的所有代码,则必须指定 MAX_ROWSMAX_COLS 的值。

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

int MAX_ROW = 31;
int MAX_COL = 19    

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

【讨论】:

  • 请解释这个答案与旧的、接受的和赞成的答案相比的附加价值,它似乎包含了你的所有观点(至少没有被 OP 的信息所涵盖,比如初始化更好调试)- 等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2013-04-20
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多