【问题标题】:Storing numbers from a file to an array [duplicate]将数字从文件存储到数组[重复]
【发布时间】:2018-04-27 13:55:19
【问题描述】:

我正在编写一种算法,该算法从命令提示符获取文件并将其数字存储到数组中。

文件如下所示:

12 563 898 521

这里是代码:

// INCLUSION
#include <stdio.h>
#include <stdlib.h>

//  CODE

void howto(const char *) ;

int main(int k, const char *argv[])
{   if (k < 2) howto(*argv) ;
    int i = 0, array[2500] ;
    FILE * R = fopen(argv[1], "r") ;

    // pass file content to array
    if (! R) return 1 ;
    while (!feof(R)) {
        fscanf(R, "%d ", &array[i]) ;
        i++ ; }
    fclose(R) ;
    for(int x = 0 ; x < i ; x++ ) {
        printf("lol : %d\n", array[x]) ; }
    return 0 ; }

void howto(const char *P) {printf("Expected: %s <file to read>\n", P) ; }

代码在没有警告的情况下运行但没有结果:它有点永远运行。 我猜我的问题出在我的 while 循环上,但我已经有一段时间没有用 C 编码了,我不知道为什么语法没有达到预期的效果。 有什么想法吗?

谢谢!

【问题讨论】:

  • 请使用正统的C布局风格,最好是Allman或1TBS。 Pico 样式对于 Pico 是可以的,但对于 C 则不行。
  • 请注意,如果输入是交互式的,scanf()-family 格式字符串中的尾随空格会很糟糕。另外,你应该检查你没有溢出数组。
  • @JonathanLeffler 你能详细说明我不应该在我的 fscanf 中使用空白的原因吗?
  • @InTheMoodForNow 您可以从 Wiki 开始:en.wikipedia.org/wiki/Indentation_style#Styles

标签: c arrays loops


【解决方案1】:

阅读fscanf 的手册页并检查返回值。 man 3 fscanf

这些函数成功返回输入项的数量 匹配的 和分配,它可以比规定的要少,甚至为零 早期匹配失败事件

替换

while (!feof(R)) {
      fscanf(R, "%d ", &array[i]) ;
      i++ ; 
}

while (i < 2500 && fscanf(R, "%d ", &array[i]) == 1) { /*return 1 if read one item */
      i++ ;
}

另请阅读Why is “while ( !feof (file) )” always wrong?

【讨论】:

  • 我确信它来自那个时候!非常感谢您也阅读了深入的回答。解决了我的问题并告诉我为什么我首先拥有它;)。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 2013-10-27
  • 2017-10-07
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多