Reading each line of file into array

后端 未结 2 502
误落风尘
误落风尘 2020-12-19 11:44

I\'m reading a file and want to put each line into a string in an array. The length of the file is arbitrary and the length of each line is arbitrary (albeit assume it will

相关标签:
2条回答
  • 2020-12-19 11:59

    You should change the line:

    char** words = (**char)malloc(sizeof(*char));
    

    into this:

    char** words=(char **)malloc(sizeof(char *)*Max_Lines);
    
    0 讨论(0)
  • 2020-12-19 12:07

    There are a few issues with your program. The realloc() statement is not used correctly. I also prefer fgets() for getting a line. Here is my solution. This also uses realloc() to increase the allocation of the buffer lines so that you neither have to know the number of lines in advance nor do you have to read the file in two passes (faster that way). This is a common technique to use when you don't know how much memory you'll have to allocate in advance.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    
        {
        int lines_allocated = 128;
        int max_line_len = 100;
    
        /* Allocate lines of text */
        char **words = (char **)malloc(sizeof(char*)*lines_allocated);
        if (words==NULL)
            {
            fprintf(stderr,"Out of memory (1).\n");
            exit(1);
            }
    
        FILE *fp = fopen("coll.txt", "r");
        if (fp == NULL)
            {
            fprintf(stderr,"Error opening file.\n");
            exit(2);
            }
    
        int i;
        for (i=0;1;i++)
            {
            int j;
    
            /* Have we gone over our line allocation? */
            if (i >= lines_allocated)
                {
                int new_size;
    
                /* Double our allocation and re-allocate */
                new_size = lines_allocated*2;
                words = (char **)realloc(words,sizeof(char*)*new_size);
                if (words==NULL)
                    {
                    fprintf(stderr,"Out of memory.\n");
                    exit(3);
                    }
                lines_allocated = new_size;
                }
            /* Allocate space for the next line */
            words[i] = malloc(max_line_len);
            if (words[i]==NULL)
                {
                fprintf(stderr,"Out of memory (3).\n");
                exit(4);
                }
            if (fgets(words[i],max_line_len-1,fp)==NULL)
                break;
    
            /* Get rid of CR or LF at end of line */
            for (j=strlen(words[i])-1;j>=0 && (words[i][j]=='\n' || words[i][j]=='\r');j--)
                ;
            words[i][j+1]='\0';
            }
        /* Close file */
        fclose(fp);
    
        int j;
        for(j = 0; j < i; j++)
            printf("%s\n", words[j]);
    
        /* Good practice to free memory */
        for (;i>=0;i--)
            free(words[i]);
        free(words);
        return 0;
        }
    
    0 讨论(0)
提交回复
热议问题