簡體   English   中英

如何從文件中讀取數據以進行編程

[英]How can I read data from a file to program

我需要從如下所示的文件中獲取數據:

在此處輸入圖像描述

然后打印在我的屏幕上。

由於破折號(-),我無法弄清楚如何打印它。

我試過這段代碼:

typedef struct studenti {
    char index[10];
    char ime[20];
    char prezime[20];
    int kviz[10];
} studenti;

void init_load() {
    int i;
    studenti studenti;

    FILE *fp;
    fp = fopen("studenti_2022.txt", "r");
    if(fp == NULL){
        printf("Doslo je do greske");
        return 0;
    }
    while(fread(&studenti, sizeof(studenti), 1, fp)){
        printf("%s", studenti.index);
        printf("%s", studenti.ime);
        printf("%s", studenti.prezime);
        printf("%d", studenti.kviz);
    }
    fclose(fp);
}

fread通常用於讀取二進制數據,通常是錯誤的 function 用於文本格式文件。 除非您使用fwrite將結構直接寫入文件,否則您將需要其他內容。

在這種情況下,您可以使用fgetsfgetcfscanf等函數將文件的內容視為文本,並解析已知格式。

strtok可用於進一步標記字符串,而strtol / sscanf可用於從這些標記中讀取整數。

這是一個粗略的例子:

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

typedef struct {
    char index[10];
    char ime[20];
    char prezime[20];
    int kviz[10];
} student_info;

int get_next_entry(student_info *si, FILE *f) {
    if (3 != fscanf(f, "%9s%19s%19s", si->index, si->ime, si->prezime))
        return 0;

    char buffer[256];

    if (fgetc(f) != '\n' || !fgets(buffer, sizeof buffer, f))
        return 0;

    size_t i = 0;
    char *tok = strtok(buffer, "|");

    if (tok) do {
        si->kviz[i++] = (int) strtol(tok, NULL, 10);
    } while (i < 10 && (tok = strtok(NULL, "|")));

    /* make sure we read enough ints, and our delimiting line is there. */
    if (i != 10 || !fgets(buffer, sizeof buffer, f) ||
            0 != strncmp(buffer, "----------", 10))
        return 0;

    return 1;
}

int main(void) {
    FILE *file = fopen("data.txt", "r");
    student_info info;

    if (file) while (get_next_entry(&info, file)) {
        printf("%s\n%s\n%s\n", info.index, info.ime, info.prezime);

        for (size_t i = 0; i < 10; i++)
            printf("%d ", info.kviz[i]);
        putchar('\n');
    }

    fclose(file);
}

data.txt

I-0123-45
John
Doe
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
--------------------------------------
I-0042-99
Jane
Doe
1 | 4 | 3 | 2 | 14 | 6 | 3 | 8 | 1 | 11 |
---------------------------------------

Output:

I-0123-45
John
Doe
1 2 3 4 5 6 7 8 9 10
I-0042-99
Jane
Doe
1 4 3 2 14 6 3 8 1 11

暫無
暫無

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

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