2012-06-23 121 views
6

tôi phải viết một chương trình trong C để đọc một tập tin có chứa một vài dòng văn bản, mỗi dòng chứa hai biến: một số (% f) và một chuỗi:Fscanf hoặc Fgets? Đọc một dòng tập tin sau khi dòng

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

Có là mã của tôi:

#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); 
    } 

    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); 
     } 

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

} 

Chương trình cần đọc tất cả dòng và tìm thành phố tôi đã viết trên argv[2]. Hơn nó sẽ cho tôi biết nhiệt độ trung bình trên thành phố đó, thông báo cho tôi nếu một dòng trong tệp có định dạng sai.

Chương trình được biên dịch chính xác cho tôi nhưng nó không xuất ra bất kỳ thứ gì trên màn hình ... làm cách nào tôi có thể giải quyết điều đó? Có đúng không khi sử dụng fscanf trong trường hợp này hoặc tốt hơn là fgets?

Tôi là một sinh viên như vậy, xin vui lòng, cho tôi một "academical" cách để giải quyết nó :)

Trả lời

11

Một vài điều .

Trước tiên, bạn phải sử dụng fclose().
Thứ hai, mã của bạn cần phải fscan() mỗi dòng trong tệp. Không chỉ trước vòng lặp while(), mà trong vòng lặp while bạn phải fscan() cho lần lặp tiếp theo.
Thứ ba, bạn không tìm ra nhiệt độ trung bình, bạn đang tính tổng của tất cả các nhiệt độ được tìm thấy. Sửa lỗi đó bằng cách thay đổi "t_tot" thành "(t_tot/found)" trong printf() cuối cùng của bạn.

Cuối cùng, tôi không chắc tại sao bạn không nhận được bất kỳ đầu ra nào. Dữ liệu nhập của bạn giống như "myprogram file.txt Milano" phải không? Làm việc cho tôi. Dù sao, đây là mã (đã chỉnh sửa) của bạn:

#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); 

    } 
} 
+0

Cảm ơn câu trả lời của bạn, tôi vừa sửa mã của tôi. – Lc0rE

2

Mã của bạn không gọi fscanf trong vòng lặp như nó nên: đọc được thực hiện một lần, và sau đó chương trình có thể tồn tại ngay lập tức nếu tệp trống hoặc vòng lặp vô thời hạn.

Bạn nên di chuyển cuộc gọi của fscanf bên trong vòng lặp while. Một cách mã hóa điển hình là đặt nhiệm vụ bên trong tiêu đề vòng lặp, như sau:

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

Cảm ơn câu trả lời của bạn. Tôi chỉ nhận ra lỗi của tôi! Nếu tôi muốn thực hiện một giải pháp với fgets thay vì fscanf, làm thế nào tôi có thể làm điều này? – Lc0rE

+1

@ l_core Bạn cần phải thay đổi một vài điều: đầu tiên, bạn cần một bộ đệm cho 'fgets'; sau đó bạn sẽ thay thế kiểm tra cho 'EOF' bằng một kiểm tra' NULL' trong vòng lặp; cuối cùng, bạn cần phải phân tích cú pháp bộ đệm theo cách thủ công, bằng cách tìm vùng đầu tiên, cho phần ban đầu vào 'atof' và sao chép phần còn lại trong' strdup'. – dasblinkenlight

1

sửa đổi mã như thế này ... chỉ cần đặt một lệnh fscanf khác trong câu lệnh.

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); 
} 

} 
3

bạn phải đặt dòng fscanf bên trong vòng lặp while

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

cuối cùng đóng file

nếu u đang sử dụng fgets thay đổi như sau

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

"1" ở lại là gì? – Lc0rE

+1

1 cho biết luôn đúng – Riskhan

+1

vui lòng xem câu trả lời đã chỉnh sửa – Riskhan

Các vấn đề liên quan