簡體   English   中英

fscanf文件中的特定數字

[英]fscanf specific digits from a file

所以我得到了這個文件,我只想對第一個{}內的數字進行scanf()而不是第二個{}內的數字,依此類推。 我設法只從文件中調用數字,但是我不知道如何將它們分成幾組

這是文件:

{5, 2, 3}, {1,5}, { }, { }, {3}, { }, { }

下面是我到目前為止使用的代碼

    void main()
{
    int rc=0,num,size;
    FILE* f = fopen("graph-file.txt","rt");
    if (f == NULL)
    {
        printf("Failed to open the file\n");
    }
    size = fscanf(f,"%d",&num);
    fseek(f,1,SEEK_CUR);
    while(rc != EOF)
    {
            if( rc == 1)
            {
                printf("%d\n",num);
            }
            fseek(f,1,SEEK_CUR);
        rc = fscanf(f,"%d",&num);

    }
}

數組可能是完成此任務所需要的。 數組使您可以存儲各種數字,從而可以存儲所讀取的內容。 這樣便可以分隔分組。 下一部分將是如何更改您正在查看的數組的哪一部分,此鏈接也應對此有所幫助。 C數組教程。

如果您要讀取的數字只是個位數,那么您可以放棄fseek和fscanf函數,而改用getc。 只需檢查每個讀取的內容是否不是數字“ 0”-“ 9”。 C語言

我鏈接的那些網站上還有許多其他不錯的教程,可用於學習C \\ C ++。

祝好運。 編輯:較少居高臨下。

您的代碼本身存在一些問題,例如,模式字符串錯誤的"rt" 您只需要為二進制文件指定"b" ,這只會影響行尾字符,如果在不同平台上讀寫文件,可能會出現問題。

要實現您想要的目標,沒有簡單的方法,就像@ JonathanLeffler 在此注釋中建議的那樣您可以使用jsonjson-c 1是一個非常易於使用的庫。

如果您想自己做,請嘗試一下我剛才編寫的代碼

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

int
append_number(int size, int **arrays, int value)
{
    void *pointer;

    pointer = realloc(arrays[0], (++size + 1) * sizeof(**arrays));
    if (pointer == NULL)
        return 0;
    arrays[0] = pointer;
    arrays[0][size] = value;

    return 1;
}

int
get_value(const char *input)
{
    if (input == NULL)
        return -1;
    while ((*input != '\0') && (isspace((unsigned char) *input) != 0))
        input++;
    if (*input == '\0')
        return -1;
    return atoi(input);
}

int *
extract_arrays(char *array)
{
    int value;
    int *list;
    list = malloc(sizeof(*list));
    if (list == NULL)
        return NULL;
    list[0] = 0;
    while (array != NULL)
    {
        char *delimiter;

        delimiter = strchr(array, ',');
        if (delimiter != NULL)
            *delimiter = '\0';
        value = get_value(array);
        if (value > 0)
            list[0] += append_number(list[0], &list, value);
        if (delimiter != NULL)
            array = delimiter + 1;
        else
            array = NULL;
    }

    return list;
}

void
print_array(int *list)
{
    fprintf(stdout, "[");
    for (int j = 1 ; j < list[0] ; ++j)
        fprintf(stdout, "%d ", list[j]);
    if (list[0] > 0)
        fprintf(stdout, "%d", list[list[0]]);
    fprintf(stdout, "]\n");
}

int **
parse_line(char *line, size_t *count)
{
    char *open;
    char *close;
    char *next;
    int **arrays; // Depends on the maximum size of an inner array

    *count = 0;
    arrays = NULL;
    next = line;

    while ((next != NULL) && ((open = strchr(next, '{')) != NULL))
    {
        close = strchr(open, '}');
        if (close != NULL)
        {
            void *pointer;
            char *values;

            *close = '\0';
            next = strchr(close + 1, ',');
            values = open + 1;
            pointer = realloc(arrays, (*count + 1) * sizeof(*arrays));
            if (pointer == NULL)
                goto error;
            arrays = pointer;

            arrays[(*count)++] = extract_arrays(values);
        }
        else
            next = open + 1;
    }
    return arrays;
error:
    for (size_t i = 0 ; i < *count ; ++i)
        free(arrays[i]);
    free(arrays);
    *count = 0;
    return NULL;
}

int main(void)
{
    char line[100];
    size_t count;
    int **arrays;
    FILE *file;

    file = fopen("graph-file.txt", "r");
    if (file == NULL)
        return -1; // Failure openning the file
    while (fgets(line, sizeof(line), file) != NULL)
    {
        arrays = parse_line(line, &count);
        for (size_t i = 0 ; i < count ; ++i)
        {
            print_array(arrays[i]);
            // DO something with it ...
            free(arrays[i]);
        }
        free(arrays);
    }
    fclose(file);
    return 0;
}

當然,有很多可能的優化方法( 特別是realloc()部分 ),但我將其留給您。

上面, parse_line()返回的int **指針包含count數組,其中第一個元素是每個數組的長度。


1 我知道在大多數linux發行版中,都可以使用包管理器安裝它,並且最近我在一些與Web開發相關的項目中經常使用它。

暫無
暫無

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

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