在c中获取文件中每行的值

时间:2018-03-13 22:18:28

标签: c file scanf readfile

我需要阅读这个main.txt文件:

STUDENT ID 126345
TEACHER MATH CLASS 122

我需要从这个文件中获取每个值。如果这个main.txt文件是这样的:

STUDENT ID 126345
TEACHER ID 3654432

我可以这样做:

#include <stdio.h>

int main(){
    FILE *ptr_file;

    int id;
    char string1[100],string2[100];
    ptr_file = fopen("main.txt","r");

    while(fscanf(ptr_file,"%s %s %d",string1,string2,id) != EOF){
       }
    }

但是我不能使用fscanf()函数,因为这些值之间的空间量对于每一行都不相等。如何像这段代码一样逐行获取每个值?

1 个答案:

答案 0 :(得分:3)

如果每行有3个由空格(或制表符)分隔的值,则

fscanf(ptr_file,"%s %s %d",string1,string2,&id);

没问题(请注意我使用&id代替id),因为%s匹配一系列非空白字符,所以它 无论值之间有多少空格,%s都会消耗 空格:

#include <stdio.h>

int main(void)
{
    const char *v = "STUDENT  \t  ID   \t  126345";
    int id; 
    char string1[100],string2[100];

    sscanf(v, "%s %s %d", string1, string2, &id);
    printf("'%s' '%s' %d\n", string1, string2, id);
    return 0;
}

打印

$ ./a 
'STUDENT' 'ID' 126345

一般来说,最强大的解决方案是逐行读取fgets 并使用sscanf解析该行,因为您可以更好地控制行何时行 格式错误:

char buffer[1024];
while(fgets(buffer, sizeof buffer, stdin))
{
    int id; 
    char string1[100],string2[100];
    if(sscanf(buffer, "%99s %99s %d", string1, string2, &id) != 3)
    {
        fprintf(stderr, "Line with wrong format\n");
        break;
    }

    // do something with read values
}

修改

用户Weather Vane指出该行可能包含3或4个值,然后是您 可以做到这一点:

char buffer[1024];
while(fgets(buffer, sizeof buffer, stdin))
{
    int id; 
    char string1[100],string2[100],string3[100];
    res = sscanf(buffer, "%99s %99s %99s %d", string1, string2, string3, &id);

    if(res != 4)
    {
        int res = sscanf(buffer, "%99s %99s %d", string1, string2, &id);

        if(res != 3)
        {
            fprintf(stderr, "Line with wrong format, 3 or 4 values expected\n");
            break;
        }
    }


    if(res == 3)
        printf("'%s' '%s' %d\n", string1, string2, id);
    else
        printf("'%s' '%s' '%s' %d\n", string1, string2, string3, id);

}