我的代码出了什么问题? C语言

时间:2015-12-26 14:11:29

标签: c

我的代码出了什么问题?第一行在input.txt中是正确的,但第二行已被破坏,我不知道为什么date会花费一行。为什么元素packmethod会选择日期?

我的代码:

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

int main(int argc, const char * argv[]) {

    FILE *fr;
    char date[11];
    char pack[3], method[4];

    fr = fopen("input.txt","r");

    if(fr == NULL)
        printf("File not found\n");

    while(!feof(fr)) {
        fgets(date,11,fr);
        fgets(pack, 3, fr);
        fgets(method, 4, fr);
        printf("%s %s %s",date,pack,method);
    }

    fclose(fr);
    return 0;
}

我的input.txt:

2015-05-01 A GG
2015-05-02 H GG
2015-05-03 H AA
2015-05-05 G SS
2015-05-06 D GG
2015-05-17 V GG
2015-05-24 AAAAA
2015-05-29 V GG
2015-06-01 V GG

也许有人知道如何从文件中读取日期格式(不像我的代码中那样),以及如何检查它是否是下个月?

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误,例如字符串太短,使用feof()并尝试在文件的同一文本行中多次使用fgets()。虽然可能,但它不是很干净,所以我在阅读整个文本行后使用strtok()

在这个重写的代码中,我还检测到月份的变化。我已经使用了指向行内数据的指针。请注意,如果要将提取的数据存储到数组中,则必须制作此类数组并复制数据,因为数据会在每一行上被覆盖。

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

int main(int argc, const char * argv[])
{
    FILE *fr;
    char line[42];
    char *date, *pack, *method;
    int year, month, day, lastmonth = -1;

    if((fr = fopen("input.txt","r")) == NULL)
        exit(1);

    while(fgets(line, sizeof line, fr) != NULL) {   // instead of feof()

        pack = method = NULL;                       // preset to test later
        date = strtok(line, " \r\n\t");             // strip newline too
        if(date && strlen(date) == 10) {            // check valid substring
            year  = atoi(date);
            month = atoi(date+5);
            day   = atoi(date+8);
            printf("%04d-%02d-%02d", year, month, day);
            pack  = strtok(NULL, " \r\n\t");
            if(pack) {                              // was substring extracted?
                method  = strtok(NULL, " \r\n\t");
            }
            if (pack && method) {                   // were substrings extracted?
                printf(" %s %s", pack, method);
                if (month != lastmonth && lastmonth >= 0)
                    printf(" *New month*");
                }
            else {
                printf(" *Ignored*");
            }
            lastmonth = month;
            printf("\n");
        }
        else {
            printf("*Invalid line*\n");
        }
    }

    fclose(fr);
    return 0;
}

节目输出:

2015-05-01 A GG
2015-05-02 H GG
2015-05-03 H AA
2015-05-05 G SS
2015-05-06 D GG
2015-05-17 V GG
2015-05-24 *Ignored*
2015-05-29 V GG
2015-06-01 V GG *New month*