Программа на C читает большой текстовый файл и хранит информацию в структуре - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю над программой на C, которая требует, чтобы я прочитал довольно большой текстовый файл и сохранил информацию в структурах.Файл содержит имена актеров и фильмы, в которых они были. Я искал свой учебник и другие онлайн-ресурсы, но все еще не знаю, как поступить.

У меня есть старая программа, которая читает файлы, похожие на файлы, но форматируется намного лучше.Мне нужно изменить его в соответствии с моими потребностями в этом проекте, но я не знаю как.

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
#define START 239
#define END 374

//method to find the index of a char c in a string
int indexOf(char c, char *string){
    ///iterating through char array, checking if any character matches c
    for(int i=0;string[i]!='\0';i++){
        if(string[i]==c){
        //found
        return i;
        }
    }
    //not found
    return -1;
}

//method to find the substring of a string between indices from and to
//and store the result in result

void substring(char *string, int from, int to, char *result){
    int index=0;
    //storing characters between from and to to result
    for(int i=from;i<to;i++){
        result[index]=string[i];
        index++;
    }
    //null terminating the array
    result[index]='\0';
}


//a structure to represent an actor

struct Actor{
    char lastName[20];
    char firstName[20];
    char movie[20];
};

//method to print name and movie of an actor in separate lines

void print(struct Actor actor) {
    printf("First name: %s\n",actor.firstName);
    printf("Last name: %s\n",actor.lastName);
    printf("Movie: %s\n\n",actor.movie);
}

int main(){

    //creating a file pointer, asking user for the file name
    FILE *fp;
    //opening file in read mode
    fp = fopen("./actors.txt","r");

    if(fp == NULL){
        //file can not be opened
        printf("File not found!\n");
        return 0;
    }

    //creating a char array to store each line, one at a time
    char buffer[100];
    //creating an Actor structure object
    struct Actor actor;
    //needed variables
    int index1 = 0, index2 = 0,index3 = 0, index4 = 0;
    //reading all lines one by one
    int i = 0;
    while(fgets(buffer, 100, fp)){
        i++;
        if(i > START && i < END ){
            getLen(buffer);
            ///finding index of comma (,)
            index1 = indexOf(',',buffer);
            //cutting the string between indices 0 and index1
            //and storing as actor's lastname
            substring(buffer,0,index1,actor.lastName);
            ///finding index of tab (\t)
            index2=indexOf('\t',buffer);
            //storing string between indices index1 and index2 in firstname
            substring(buffer,index1,index2,actor.firstName);
            ///finding year parentheses
            index3=indexOf('(', buffer);
            ///fetching movie title

            substring(buffer,index2,index3-1,actor.movie);
            //printing actor
            print(actor);
        }
    }
        //closing file
    fclose(fp);
}

Данные в текстовом файле имеют формат:

lastname, firstname\t\tMovie (year) [role]
\t\t\tmore movies

Мне нужно только имя актера и фильмы, в которых он был. Вот пример данных, которые я пытаюсь прочитать и сохранить.

Parr, Brian (I)     Blue Ice (1992)  [Stallholder]  <20>
        Eskimo Day (1996) (TV)  [Second cabbie]  <22>
        Summer in the Suburbs (2000) (TV)  [Neighbor #2]  <22>
        The fairy queen (La reine des fées) (1989) (TV)  [Snug]  <12>

Rogers, Marcus (II)     .357 (2005)  [Joshua]
        Streets (2004)  [Man in car]
        Summer in the Suburbs (2000) (TV)  [Bobby]  <16>
        "15 Storeys High" (2002) {The Sofa (#1.1)}  [Lawyer]  <5>

Вот мой вывод:

First name: , Brian (I)
Last name: Parr
Movie:

First name:
Last name:
Movie:                   Eskimo Day

First name:
Last name:
Movie:                   Summer in the SubrnSw

First name: b
Last name:
Movie:                   The fairy queen

First name: b
Last name:
Movie:

First name: , Marcus (II)
Last name: Rogers
Movie:

First name: b
Last name:
Movie:                   Streets

First name: b
Last name:
Movie:                   Summer in the SubrnSw

First name: b
Last name:
Movie:                   "15 Storeys High"rnSw

Как я могу прочитать эти файлы и сохранить их в своей структуре, чтобы они не печатались с дополнительными вкладками и символами?Кроме того, структура нуждается в массиве фильмов, поэтому я пытаюсь заставить его напечатать как:

Actor Name
Movies
Movies
Movies
Movies

Я попытался добавить цикл, но мне не повезло.Я все еще очень плохо знаком с C, и мой учебник ужасен.Я искал в Интернете дополнительные ресурсы, но, похоже, ничего не нашел.Пожалуйста, как я могу это исправить, чтобы я только читал и сохранял имена и фильмы?

С другой стороны, меня не касаются телешоу, которые появляются с двойными кавычками "show"

1 Ответ

0 голосов
/ 10 декабря 2018

Вам просто нужно немного проверок, чтобы достичь своего результата.Вам нужно сохранить прежнее имя, пока вы не найдете строку, которая просто "\ n".Также нет необходимости переопределять функции, которые уже существуют в стандартной библиотеке C (но вы можете переопределить их, если хотите):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
#define START 0
#define END 374

//a structure to represent an actor

struct Actor{
    char lastName[20];
    char firstName[20];
    char movie[50];
};

//method to print name and movie of an actor in separate lines

void print(struct Actor actor) {
    printf("First name: %s\n",actor.firstName);
    printf("Last name: %s\n",actor.lastName);
    printf("Movie: %s\n\n",actor.movie);
}

int main(){

    //creating a file pointer, asking user for the file name
    FILE *fp;
    //opening file in read mode
    fp = fopen("./actors.txt","r");

    if(fp == NULL){
        //file can not be opened
        printf("File not found!\n");
        return 0;
    }

    //creating a char array to store each line, one at a time
    char buffer[100];
    //creating an Actor structure object
    struct Actor actor;
    //reading all lines one by one
    int i = 0;
    int check=0;
    char *ptr;
    while(fgets(buffer, 100, fp)){
        i++;
        int len;
        if(i > START && i < END ){
            if ( strcmp( buffer, "\n") == 0)
            {
                check = 0;
                continue;
            }
            if( !check)
            {
                len = strchr(buffer, ',') - buffer - 1;
                strncpy( actor.lastName, buffer, len);
                actor.lastName[len] = '\0';
                if( (ptr = strchr(buffer, ',')))
                {
                    len = strchr(buffer, '\t') - ptr -1;
                    strncpy( actor.firstName, ptr+1, len);
                    actor.firstName[len] = '\0';
                }
                check = 1;
            }
            if( (ptr = strchr(buffer, '\t')))
            {
                len = strchr( ptr, '(') - ptr-2;
                strncpy( actor.movie, ptr+2, len);
                actor.movie[len] = '\0';
            }
            //printing actor
            print(actor);
        }
    }
        //closing file
    fclose(fp);
}

Вывод

First name:  Brian (I)
Last name: Par
Movie: Blue Ice 

First name:  Brian (I)
Last name: Par
Movie: Eskimo Day 

First name:  Brian (I)
Last name: Par
Movie: Summer in the Suburbs 

First name:  Brian (I)
Last name: Par
Movie: The fairy queen 

First name:  Marcus (II)
Last name: Roger
Movie: .357 

First name:  Marcus (II)
Last name: Roger
Movie: Streets 

First name:  Marcus (II)
Last name: Roger
Movie: Summer in the Suburbs 

First name:  Marcus (II)
Last name: Roger
Movie: "15 Storeys High"  

Если вы хотите, вы можететакже обобщите это, создав функцию типа

void parse( char * dest, char * string, char delim, int offset1, int offset2)
{
    int len = strchr(string, delim) - string - 1 - offset1;
    strncpy( dest, string + 1 + offset2, len);
    dest[len] = '\0';
}

, которая бы выглядела так:

        if( !check)
        {
            parse(actor.lastName, buffer, ',', 0, -1);
            if( (ptr = strchr(buffer, ',')))
                parse( actor.firstName, ptr, '\t', 0,0);
            check = 1;
        }
        if( (ptr = strchr(buffer, '\t')))
            parse( actor.movie, ptr, '(', 1, 1);
        //printing actor
        print(actor);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...