-3
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *ptr;
    int n;
    int count1 = 0; //count for even
    int count2 = 0; //count for odd
    int count3 = 0; //count for prime
    int flag = 0;

    ptr = fopen("trial.txt", "r");
    n = getw(ptr);

    while(n != EOF)
    {
        if(n%2 == 0)
            count1++;
        else
            count2++;
        
        if(n > 1)
        {
            for(int i = 2; i < n/2; i++)
            {
                if(n%i == 0)
                flag = 1;                
            }
            if(flag == 0)
                count3++;                       
        }

        flag = 0;
        n = getw(ptr);
    }

    fclose(ptr);

    printf("this file has %d even %d odd and %d prime numbers", count1, count2, count3);

    return 0;
}

上面的程序应该返回偶数、奇数和素数的计数。

我创建了一个文本文件,其中包含我要计算的数字。例如,如果它包含2, 4, 6, 8,我的程序应该返回以下输出: 2 even 0 odd 0 prime

https://imgur.com/xAccwvO - 这是文本文件

4

3 回答 3

1

正如评论中指出的那样,我认为您如何从文件中读取整数值存在问题。

int getw(FILE *)函数用于直接从文件的字节中读取整数,而不是从文件的文本内容中读取整数。

printf("n = %d\n", n);在您的 while 循环中添加了一个以查看正在处理的整数值。当我运行它时,我发现了这个:

c-posts : $ gcc readoddevenfromfile.c 
c-posts : $ ./a.out 
n = 171051569
n = 171182643
n = 171313717
n = 171444791
n = 808520249
this file has 0 even 5 odd and 1 prime numbers

我认为您应该我们fgets()逐行读取文件,然后使用sscanf()从行中提取整数,如下所示:

    char line[10]; 
    
    ptr = fopen("trial.txt","r");
    while(fgets(line, 10, ptr))
    {
        sscanf(line, "%d", &n);
        // Check whether n is even, odd or prime

或者,如果您在一行中有整数(如屏幕截图中提供的那样)。您可以使用以下方法一一阅读fscanf

    ptr = fopen("trial.txt","r");
    while(fscanf(ptr, "%d", &n) != EOF)
    {
      // Check whether n is odd, even or prime
于 2021-02-18T10:03:39.077 回答
1

Rohan Kumar 是对的,您应该使用fgets()orfscanf()代替getw(),因为您正在阅读文本文件。让我分享一个我使用fscanf(). 我还改变了 for 循环的条件,写成 i <= n/2 而不是 i < n/2。

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

int main()
{
    char info[100];
    FILE * ptr = fopen("trial.txt","r");
    int n, i, flag;

    int count1 =0; //count for even
    int count2= 0; //count for odd
    int count3=0; //count for prime

    do
    {
        flag = 0;

        if (fscanf(ptr, "%d", &n) == 0) break;
        else
        {
            if (n%2 == 0) count1 += 1; /* check if the number is even  */
            else count2 += 1;

            for (i = 2; i <= n/2; ++ i) /* check if the number is prime */
            {
                if (n%i == 0) flag = 1;
            } 
            if (flag == 0) count3 += 1;
        }
    } while (!feof(ptr));

    fclose(ptr);

    printf("\nThis file has %d even, %d odd and %d prime numbers.\n",count1,count2,count3);

    return 0;
}

希望这可以帮助你,

乔瓦尼·帕切拉

于 2021-02-18T10:37:59.900 回答
0

我尝试在我的 vim 编辑器中使用 fgets() 而不是 getw 程序给出了预期的答案

于 2021-02-18T10:15:41.000 回答