Функции fscanf или помощью fgets? Чтение файла строка за строкой

мне нужно написать программу на C, чтобы прочитать файл, содержащий несколько строк текста, каждая строка содержит две переменные: число (%F) и строку:

EX: file.txt
============
24.0 Torino
26.0 Milano
27.2 Milano
26.0 Torino
28.0 Torino
29.4 Milano

вот мой код:

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

int main (int argc, char *argv[])
{
    int r, line = 0, found = 0;
    float temp, t_tot = 0;
    char loc[32];


    FILE *fp;

    fp = fopen(argv[1], "r");

    if (fp == NULL)
    {
        printf ("Error opening the filenn'");
        exit(EXIT_FAILURE);
    }

    if (argc == 3)
    {
        r = fscanf(fp, "%f %sn", &temp, loc);

        while (r != EOF)
        {
            line++;

            if (r == 2)
            {
                if(strcmp(argv[2], loc) == 0)
                {
                    t_tot += temp;
                    found++;
                }
            }
            else
                printf ("Error, line %d in wrong format!nn", line);
        }

        printf ("The average temperature in %s is: %.1fnn", argv[2], (t_tot/found);
    }

}

программа должна прочитать всю строку и найти город, который я написал на argv[2]. Чем он скажет мне среднюю температуру по этому городу, уведомив меня, если строка в файле находится в неправильном формате.

программа компилируется правильно для меня, но она не выводится что угодно на экране... как я могу это решить? Правильно ли использовать fscanf по этому делу или лучше fgets?

Я студент, поэтому, пожалуйста, дайте мне "академический" способ ее разрешения :)

4 ответов


пару вещей.

во-первых, вы должны использовать функции fclose().
Во-вторых, ваш код должен fscan() каждую строку в файле. Не только перед циклом while (), но и в каждом цикле while вы должны fscan() для следующей итерации.
В-третьих, вы не вычислять среднюю температуру, вам нужно понять сумму всех tempuratures нашли. Исправьте это, изменив "t_tot "на" (t_tot / found) " в вашем последнем printf().

наконец, я не уверен, почему вы не получение любого вывода. Ваш ввод похож на " файл myprogram.txt Milano " правильно? Работать на меня. Во всяком случае, вот ваш (отредактированный) код:

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

int main (int argc, char *argv[])
{
    int r, line = 0, found = 0;
    float temp, t_tot = 0;
    char loc[32];

    FILE *fp;
    fp = fopen(argv[1], "r");

    if (fp == NULL)
    {
        printf ("Error opening the file\n\n'");
        exit(EXIT_FAILURE);
    } else {

        if (argc == 3)
        {
            r = fscanf(fp, "%f %s\n", &temp, loc);
            while (r != EOF)
            {
                line++;
                if (r == 2)
                {
                    if(strcmp(argv[2], loc) == 0)
                    {
                        t_tot += temp;
                        found++;
                    }
                }
                else
                    printf ("Error, line %d in wrong format!\n\n", line);
                r = fscanf(fp, "%f %s\n", &temp, loc);
            }
            printf ("The average temperature in %s is: %.1f\n\n", argv[2], (t_tot / found));
        }

    fclose(fp);

    }
}

вы должны поместить строку fscanf внутри цикла while

    while (1)
    {
        r = fscanf(fp, "%f %s\n", &temp, loc);
        if( r == EOF ) 
           break;
        .........................
    }

наконец-то закрыть файл

Если u использует fgets, измените следующим образом

  char s[256];
  while( fgets( s, 256, fp) != NULL )
  {
     sscanf( s, "%f %s", &temp, loc);
     .............
  }

ваш код не вызывает fscanf в цикле, как и должно: чтение выполняется один раз, а затем программа либо существует сразу, если файл пуст, либо циклы бесконечно.

вы должны переместить вызов fscanf внутри while петли. Одним из типичных способов кодирования является размещение назначения внутри заголовка цикла, например:

while ((r = fscanf(fp, "%f %s\n", &temp, loc)) != EOF) {
    ...
}

измените код следующим образом... просто поместите еще один fscanf в заявление while.

if (argc == 3)
{
 r = fscanf(fp, "%f %s\n", &temp, loc);
  while(r != EOF )

    {
        r = fscanf(fp, "%f %s\n", &temp, loc);  
        line++;

        if (r == 2)
        {
            if(strcmp(argv[2], loc) == 0)
            {
                t_tot += temp;
                found++;
            }
        }
        else
            printf ("Error, line %d in wrong format!\n\n", line);
    }

    printf ("The average temperature in %s is: %.1f\n\n", argv[2], t_tot);
}

}