简体   繁体   English

如何让计数器在这个 C 程序中工作?

[英]How to I get the counter to work in this C program?

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

int main()
{
    FILE *myFile;
    int x, b, n = -1, i, count = 1;
    int num[101];

    myFile = fopen("a.txt", "r");
    b = fscanf(myFile, "%d", &x);
    while (b != -1){
        n++;
        num[n] = x;
        b = fscanf(myFile, "%d ", &x);
    }
        for (int i = 0; i <= n; i++){
            printf("%d ", num[i]);
        }
        printf("\n");
        for(int i = 1; i <= 100; i++){
        if(num[i] == i) {
            printf("%i has occurred: %d times\n", i, count);
            count++;
        }
    }
        fclose(myFile);
}

I have a project for a Unix and C programming class due on Monday and I cannot figure out how to work the counter.我有一个 Unix 和 C 编程课程的项目将于周一到期,但我不知道如何使用计数器。 Essentially, we're learning about using Arrays in C, pointers in C, and using File Input/Output.本质上,我们正在学习在 C 中使用数组、在 C 中使用指针以及使用文件输入/输出。 On our homework, we have to take input from a text file, and we have to print out all the values in the text file as an array.在我们的作业中,我们必须从文本文件中获取输入,并且必须将文本文件中的所有值作为数组打印出来。 That's the easy part.这是容易的部分。 The hard part is counting each specific variable in the array.困难的部分是计算数组中的每个特定变量。 I feel it would be easier to do this in Java as that's what we've been doing before taking this 200 level course.我觉得用 Java 做这件事会更容易,因为这是我们在参加这门 200 级课程之前一直在做的事情。 However, we cannot do this in java, thus I am not sure how to proceed.但是,我们无法在 Java 中执行此操作,因此我不确定如何进行。

Could you help a brother out?能帮个弟弟吗?

You are confusing things by using too many variables.您使用太多变量使事情变得混乱。 All you need to do is read each integer into the next array element while the number of elements is within your array bounds.您需要做的就是将每个整数读入下一个数组元素,同时元素的数量在您的数组范围内。 You need the array and a single counter.您需要数组和一个计数器。

Before looking at that problem, a quick lesson: Don't use Magic-Numbers and don't Hardcode-Filenames .在研究这个问题之前,先上一课:不要使用Magic-Numbers也不要使用Hardcode-Filenames Instead, if you need a constant, #define one, eg相反,如果你需要一个常量,# #define一个,例如

#define NELEM 101   /* if you need a constant, #define one (or more) */

Then use the constant within your code to size your array and set any other limits needed, eg然后使用代码中的常量来调整数组的大小并设置所需的任何其他限制,例如

    int num[NELEM];     /* array */

and

    /* read integers while n < NELEM && good read */
    while (n < NELEM && fscanf(myFile, "%d", &num[n]) == 1)
        n++;    /* advance counter */

The main() function takes arguments, int main (int argc, char **argv) , pass the filename to read as an argument to main() or take the filename as input, eg main()函数接受参数int main (int argc, char **argv) ,将文件名作为参数传递给main()或将文件名作为输入,例如

    /* read filename from 1st argument (stdin by default) */
    FILE *myFile = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!myFile) {  /* validate myfile is open for reading */
        perror ("fopen-myfile");
        return 1;
    }

That way you don't have to recompile every time you want to change the input file.这样您就不必每次要更改输入文件时都重新编译。

Now to the read.现在开始阅读。 Whenever you are reading input, you always condition the next read on the successful completion of reading the current value (or line preferably).每当您读取输入时,您总是以成功完成读取当前值(或最好是行)为条件进行下一次读取。 In that case as shown above, you simply have 2-conditions to meet, (1) you do not try and read more values than you can store in your array, and (2) when using any Xscanf() function, that the return is equal to the number of conversions anticipated.在这种情况下,如上所示,您只需满足 2 个条件,(1) 您不会尝试读取比您可以存储在数组中更多的值,以及 (2) 当使用任何Xscanf()函数时,返回等于预期的转换次数。 (you can also simply loop continually, checking the return within the loop and breaking the loop when one of your exit conditions is met) (您也可以简单地连续循环,检查循环内的返回并在满足退出条件之一时中断循环)

In your case:在你的情况下:

    int n = 0;          /* counter */
    int num[NELEM];     /* array */
    /* read filename from 1st argument (stdin by default) */
    FILE *myFile = argc > 1 ? fopen (argv[1], "r") : stdin;
    ...
    /* read integers while n < NELEM && good read */
    while (n < NELEM && fscanf(myFile, "%d", &num[n]) == 1)
        n++;    /* advance counter */

The code above reads integer values into you array until (1) the array is full, or (2) the first failed conversion occurs (which can be on either a matching-failure or EOF )上面的代码将整数值读入数组,直到 (1) 数组已满,或 (2) 第一次失败的转换发生(可以是匹配失败EOF

You are done at that point.到那时你就完成了。 You have the values stored in num and you have the count of values stored in n .您将值存储在num并将值的计数存储在n To output the values, simply loop from 0 to n-1 , which covers your filled elements.要输出值,只需从0循环到n-1 ,它涵盖了您的填充元素。 Example:例子:

    for (int i = 0; i < n; i++) {   /* output in 10-col format */
        if (i && i % 10 == 0)
            putchar ('\n');
        printf (" %6d", num[i]);
    }
    putchar ('\n');     /* tidy up with \n */

( note: the loop is the important part, you can format how it is output as you like. It is just shown in 10-columns with each value being 6-digits wide (including +/- )) 注意:循环是重要的部分,您可以根据需要格式化它的输出方式。它只显示在 10 列中,每个值都是 6 位宽(包括+/- ))

The complete example could be:完整的例子可能是:

#include <stdio.h>

#define NELEM 101   /* if you need a constant, #define one (or more) */

int main(int argc, char **argv) {

    int n = 0;          /* counter */
    int num[NELEM];     /* array */
    /* read filename from 1st argument (stdin by default) */
    FILE *myFile = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!myFile) {  /* validate myfile is open for reading */
        perror ("fopen-myfile");
        return 1;
    }

    /* read integers while n < NELEM && good read */
    while (n < NELEM && fscanf(myFile, "%d", &num[n]) == 1)
        n++;    /* advance counter */

    if (myFile != stdin)    /* close file if not stdin */
        fclose (myFile);

    for (int i = 0; i < n; i++) {   /* output in 10-col format */
        if (i && i % 10 == 0)
            putchar ('\n');
        printf (" %6d", num[i]);
    }
    putchar ('\n');     /* tidy up with \n */
}

Example Use/Output示例使用/输出

Reading a file with 61 integer values:读取具有 61 个整数值的文件:

$ ./bin/fscanfintarray dat/n_61_ints.txt
     60   1984  -7093   1236  -3680  -3184  -3936   6671   8906  -5207
  -9698   3681    952   -137    664   8798    -30  -6392   7155   7797
  -7665   4829  -4115   -435   7194   -279  -5619  -5154  -3755  -3818
  -7186  -8420  -4602  -4279  -9952   1718   2537  -3888  -1611   8676
    905   5924   2357  -8143   3019    253  -2113  -7011  -8907  -4958
  -1982  -6572  -2897   3904  -9774  -5703  -6375  -5393   6375   7102
    789

Look things over and let me know if you have any further questions.仔细检查一下,如果您有任何其他问题,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM