Читайте символ за символом из файла и помещайте каждую строку в строку - PullRequest
0 голосов
/ 30 июня 2019

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

    FILE * file = fopen(input,"r");
    if(file != NULL){
        char temp;
        char * line;
        line =  (char *) malloc(sizeof(char) * 10);
        int i = 0;
        while((temp = fgetc(file)) != EOF){

            if(temp == '\n'){

                i = 0;
            }
            else{
                if(i > strlen(line) - 2){
                    line = (char *) realloc(line,sizeof(line) * 10);
                }
                line[i] = (char) temp;
                i++;
            }

        }
        free(line);
        fclose(file);
    }
    else{

    }


1 Ответ

0 голосов
/ 30 июня 2019

следующий предложенный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. правильно проверяет ошибки
  4. выводит пользовательские сообщения об ошибках вstderr
  5. выводит текстовую причину, по которой система считает, что произошла ошибка, в stderr
  6. документах, почему каждый заголовочный файл включен
  7. показывает пример того, как обрабатыватьслучай, когда пользователю не удалось ввести параметр командной строки (в данном случае имя входного файла)
  8. использует size_t вместо int при передаче параметров в malloc() и realloc()

и теперь предложенный код:

#include <stdio.h>   // fopen(), perror(), fclose() fprintf()
#include <stdlib.h>  // exit(), EXIT_FAILURE, malloc(), realloc(). free()


int main( int argc, char *argv[] )
{
    if( argc != 2 )
    {
        fprintf( stderr, "USAGE: %s <fileName>\n", argv[0] );
        exit( EXIT_FAILURE );
    }


    FILE * file = fopen( argv[1], "r" );
    if( !file )
    {
        perror( "fopen failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen successful

    int ch;
    char * line =  malloc( 10 );
    if( !line )
    {
        perror( "malloc failed" );
        fclose( file );   // cleanup
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    size_t lineLen = 10;
    size_t i = 0;
    while( (ch = fgetc(file)) != EOF )
    {
        if( ch == '\n' )
        {
            line[i] = '\0';
            // do something with contents of line
            i = 0;
        }

        else
        {
            if(i >= lineLen )
            {
                lineLen *= 2;
                char * temp = realloc( line, lineLen );
                if( !temp )
                {
                    perror( "realloc failed" );
                    // cleanup
                    fclose( file );
                    free( line );
                    exit( EXIT_FAILURE );
                }
                line = temp;
            }
            line[i] = (char)ch;
            i++;
        }

    }
    free(line);
    fclose(file);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...