0

我有一个文件,其中包含具有它们状态的任务列表:

PENDING Task number 1
COMPLETED Task number 2
COMPLETED Task number 3

我正在尝试使用以下方法读取此文件:

char status[10];
char text[1024];

while(fscanf(file, "%s %s", status, text) != EOF) {
  printf("%s %s\n", status, text);
}

但是输出完全错误。只有任务文本的第一个单词才能到达 text 变量。我怎样才能解决这个问题?

4

3 回答 3

0
char status[10];
char text[1024];
char number[1024];
char i[1024];

while(fscanf(file, "%s %s %s %s", status, text, number, i) != EOF) {
  printf("%s %s %s %s\n", status, text, number, i);
} 

如果你知道“number”字段总是“number”并且你知道它后面跟着一个 int,你可以说:

char status[10];
char text[1024];
int i;

while(fscanf(file, "%s %s number %d", status, text, i) != EOF) {
  printf("%s %s number %s\n", status, text, i);
} 

或者

char line[1000];

while(fgets(line, 1000, file)) {
    char *p;
    for(p = strtok(line, " \n"); p; p = strtok(p, " \n")) {
        printf("%s ", p);
    }
    printf("\n");
}
于 2013-09-05T19:10:48.413 回答
0

逐行读入Buffer然后使用strtok()您可以将它们拆分为单词...

char *fgets(char *s, int size, FILE *stream);

#define MAX_LENGTH 100
File *ptr;
char buffer[MAX_LENGTH]
ptr=fopen("filepath","mode");
while(fgets(buffer,sizeof(buffer),ptr)!=EOF)
{
//use strtok  
}
于 2013-09-05T19:17:04.860 回答
0

如果您阅读诸如this one之类的参考资料,您会发现您可以使用集合作为格式,包括在输入不在集合中时读取的负集合。这意味着你可以做类似的事情

if (fscanf(file, "%s %[^\n]s", status, text) == 2)
{
    /* Got all */
}

在 format-string"%s %[^\n]s"中,第一个%s将读取 eg "PENDING",第二个 format-string%[^\n]s将读取剩余的直到换行符,所以它应该是"Task number 1"

于 2013-09-05T19:17:05.903 回答