尝试从文件中读取和打印特定行

时间:2017-01-05 13:00:32

标签: c file

我正在尝试编写一个显示外部文件的最小值,最大值和平均值的程序。

这里的文件是:

31.6    22.4    25.9
30.2    22.7    25.5
31.2    22.9    26.1
31.3    23.4    26.4
30.7    23.2    26.2
31.3    23.1    26.4
31.6    23.9    26.4
31.6    24.0    26.9
32.7    24.7    27.5
33.8    24.8    27.7
32.4    25.0    27.6
32.1    24.9    27.6
32.7    25.4    27.9
31.9    25.5    27.6
31.9    25.4    27.8
32.1    25.3    27.8
31.7    25.6    27.8
32.6    25.2    27.7
32.2    24.9    27.5
32.2    24.9    27.7
31.7    25.8    27.7
32.3    25.5    27.9
32.1    24.4    27.3
31.5    24.6    27.2
31.8    24.0    27.0 
32.0    24.4    27.4 
32.4    24.9    27.8
32.1    25.0    27.6

这是主要代码:访问和读取文件:

#include <stdio.h>
#include <cstdlib>
void main(void)
{
    FILE *feb, *mar;
    int month, date, count = 0;
    double min, max, mean;
    char *pch;
    char line[256];

    printf("Input Month (2 or 3): ");
    scanf("%d", &month);

    if(month == 2)
    {
        feb = fopen("feb.txt", "r");

        if(!feb)
        {
            printf("404: File Not Found!");
        }

        else
        {
            printf("Input Date (1 ~ 28): ");
            scanf("%d", &date);
        }

        fclose(feb);
    }

    system("pause");
    return 0;
}

问题是;我无法找到一种方法让它读取特定的行并在输出屏幕上单独打印出值。

1 个答案:

答案 0 :(得分:3)

建议的方法,举例:
1。创建一个结构。例如:

typedef struct  {  
    double min;  
    double mean;  
    double max;  
} RECORD;  
RECORD *record;  

2. 计算文件中的行数。有很多方法可以做到这一点, see one example here 鉴于您提供的示例数据(即它似乎使用换行符字符\n),这是另一个示例:

int longest=0;
int count = countLines("c:\\records.txt", &longest);

定义countlines的位置:

int countLines(char *file, int *longest)
{
    char line[260]; 
    int len=0, lenKeep=0, count=0;
    FILE *fp = fopen(file, "r");
    if(fp)
    {
        while(fgets(line, 80, fp))
        {
            len = strlen(line);
            if(len > lenKeep) lenKeep = len;
            count++;
        }
        fclose(fp);
    }
    *longest = lenKeep;
    return count;
}

3. 使用 count 元素创建一个struct数组,以包含文件记录:

record = calloc(count, sizeof(RECORD));  
if(record)  
{... 

4. 逐行读取文件(参见1.中的示例),并使用sscanf或类似方法将行内容解析为struct array的三个成员。 (使用sscanf的一些示例: here here here )。如果您的行缓冲区为line,而i为0和count之间的某个值,则以下是使用sscanf的单行解析示例:

sscanf(line, "%lf %lf %lf",&record[i].min, &record[i].mean, &record[i].max);  

5. 使用所需的成员索引打印所选记录。此代码循环遍历所有记录,例如:

for(i=0;i<count;count++)
{
    printf("%d: %f %f %f\n", i, record[i].min, record[i].mean, record[i].max);  
}