簡體   English   中英

獲取c中文件中每一行的值

[英]get the values for each line in the file in c

我需要閱讀這個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()函數,因為這些值之間的間隔量對於每一行而言並不相等。 我如何像這樣的代碼逐行獲取每個值?

如果每一行都有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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM