输出无限的性格' p'在C中使用fscanf时

时间:2017-12-23 03:35:18

标签: c

我制作了一个程序来计算input.txt中的数字:

input.txt中

~/tmp-0729/demo > lein repl      
nREPL server started on port 40638 on host 127.0.0.1 - nrepl://127.0.0.1:40638
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_144-b01
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

demo.core=> (require '[clojure.data.json :as json])
nil
demo.core=> (json/write-str {:a 1 :b 2})
"{\"a\":1,\"b\":2}"
demo.core=> (json/read-str "{\"a\":1,\"b\":2}")
{"a" 1, "b" 2}
demo.core=> 

main.c

13 1 17 3 14 10 18 18 16 13 15 5 5 6 12 8 8 3 2 5 4 10 11 3 1 5 10 1 7 5 6 10 9 4 3 10 15 13

结果是无限的性格' p' ???

https://i.stack.imgur.com/oXlv8.jpg

2 个答案:

答案 0 :(得分:1)

这有效:

#include <stdio.h>

int main(void) {
    FILE *fptr;
    if (!(fptr = fopen("input.txt", "r"))) {
        printf("Could not open file\n");
        return 1;
    }
    int data, count;
    for (count = 0; fscanf(fptr, "%d ", &data) == 1; count++)
        ;

    printf("%d\n", count);
    fclose(fptr);
    return 0;
}

请注意我对您的代码进行的以下调整。

  • 您没有进行任何错误检查以查看&#34; input.txt&#34;存在与否。你不应该编写代码,即使对于那些假设这样的小程序也是如此。如果输入文件不存在,此程序现在会打印一条错误消息并将1返回给shell。

  • while (!feof(fptr))是不好的做法,往往不起作用。要检查文件中是否有剩余数据,请使用scanf()语句本身作为循环条件。为了方便和高效,我做了一个for循环。

  • 您没有对文件指针执行fclose()。这是绝对必要的,因为您不希望文件指针在内存中浮动,并且您希望系统/ shell知道该文件已不再使用。

  • int main()成功后应始终返回0。

如果你这样做,我可以认为没有理由你的编译器或二进制文件只打印&#34; pppppp&#34;像那样。如果它继续这样做,那么你的编译器或工作空间就会出现问题。

答案 1 :(得分:0)

以下提议的代码:

  1. 在当前场景中通过在打开的文件上调用fclose()
  2. 来自行清理
  3. 在致电:fopen()fscanf()
  4. 时正确检查错误
  5. 正确使用fscanf()的返回值进行循环控制
  6. 记录每个头文件包含的原因
  7. 使用'\ n'结束printf()格式字符串,以便数据立即传递到终端,而不是等待程序退出。
  8. 现在建议的代码:

    #include <stdio.h>   // fopen(), fclose(), fscanf(), perror(), printf()
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    
    
    int main( void )
    {
        FILE *fptr = fopen("input.txt","r");
        if( ! fptr )
        {
            perror( "fopen failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, fopen successful
    
        int data;
        int count=0;
    
        while( 1 == fscanf(fptr,"%d",&data) )
        {
            count++;
        }
    
        printf("%d\n",count);
    
        fclose( fptr );
    }