我的代码出了什么问题?第一行在input.txt
中是正确的,但第二行已被破坏,我不知道为什么date
会花费一行。为什么元素pack
和method
会选择日期?
我的代码:
#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
也许有人知道如何从文件中读取日期格式(不像我的代码中那样),以及如何检查它是否是下个月?
答案 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*