简体   繁体   English

C程序读取大文本文件并将信息存储在struct中

[英]C program reading large text file and storing information in struct

I am working on a C program that requires me to read a fairly large text file and store the information in structs. 我正在开发一个C程序,该程序需要我阅读一个相当大的文本文件并将信息存储在结构中。 THe file contains actors names and movies they've been in. I have searched my textbook and other online resources but still don't know how to proceed. 该文件包含演员姓名和他们去过的电影。我已经搜索了我的教科书和其他在线资源,但仍然不知道如何进行。

I have an older program that read a file kind of similar but formatted much better. 我有一个较旧的程序,可以读取类似的文件,但格式要好得多。 I need to alter it to fit my needs for this project but don't know how. 我需要对其进行更改以满足我对该项目的需要,但不知道如何做。

My code: 我的代码:

#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);
}

The data in the text file is in the format: 文本文件中的数据格式为:

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

I only need the actor name and movies they've been in. Here is a sample of the data I am trying to read and store. 我只需要演员姓名和他们去过的电影即可。这是我尝试读取和存储的数据示例。

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>

Here is my output: 这是我的输出:

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

How can I read these files and store them in my struct so that they don't print with extra tabs and characters? 如何读取这些文件并将其存储在结构中,以使它们不会带有多余的制表符和字符进行打印? In addition, the struct needs an array of movies so I'm trying to get it to print like: 另外,该结构需要一系列电影,因此我尝试将其打印为:

Actor Name
Movies
Movies
Movies
Movies

I tried adding a loop to do this but I had no luck. 我尝试添加一个循环来执行此操作,但是我没有运气。 I am still very new to C and my textbook is aweful. 我对C还是很陌生,我的课本很棒。 I've searched online for additional resources but can't seem to find anything. 我在网上搜索了其他资源,但似乎找不到任何东西。 Please, how can I fix this so I am only reading and storing the names and movies? 拜托,我该如何解决这个问题,这样我才可以阅读和存储姓名和电影?

On another note, I am not concerned with TV shows which appear with double quotes "show" 另一方面,我不关心电视节目中出现双引号“ show”

You just need a little bit of checks to achieve your result. 您只需要一点点检查就可以达到目的。 You need to keep the previous name until you find a line that is just "\\n". 您需要保留以前的名称,直到找到仅一行“ \\ n”。 Also no need to redefine functions that already exist in C standard library (but you could re-implement them if you want): 同样,也不需要重新定义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);
}

Output 输出量

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"  

If you wanted you could also generalize this by creating a function like 如果您愿意,还可以通过创建类似

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';
}

which would make the code look like this: 这会使代码看起来像这样:

        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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM