从文件中逐字符读取字符,并将每一行放入字符串

时间:2019-06-30 14:13:21

标签: c file dynamic-memory-allocation

我必须逐个字符地从文件中读取字符,并将每一行放入字符串中。 问题是我不知道每行的大小,所以最终我不得不重新分配内存。因此,如果我尝试重新分配,我的程序将返回错误。我在做错什么吗?

    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 :(得分:0)

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确检查错误
  4. 将用户错误消息输出到stderr
  5. 输出系统认为stderr发生错误的文本原因
  6. 说明为什么包含每个头文件
  7. 显示了如何处理用户未能输入命令行参数(在这种情况下为输入文件名)的情况的示例
  8. 在将参数传递到size_tint时使用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);
}