читать файл построчно в C (без использования fgets) - PullRequest
0 голосов
/ 09 декабря 2018

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

* обнаружено разрушение стека *: /home/ubuntu/workspace/ex12.co прекращено Прервано

 #include <stdio.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include<stdio.h> 
 #include<fcntl.h> 
 #include<errno.h> 
 #include <unistd.h>
 extern int errno;                               
int main( int argc, char *argv[] )  {
    char *path1;   
    char  firstline[80];
    char  secondline[80];
    char  thirdline[80];  

    printf("Program name %s\n", argv[0]);

    if( argc == 2 ) {
         printf("The path of the config file that you supplied is %s\n", argv[1]);
    }
    else if( argc > 2 ) {
        printf("Too many arguments supplied.\n");
    }
    else {
        printf("One argument expected.\n");
    }

    int fd1 = open(argv[1], O_RDONLY | O_CREAT);  

    if (fd1 ==-1) 
    { 
        // print which type of error have in a code 
        printf("Error Number % d\n", errno);  

        // print program detail "Success or failure" 
        perror("Program"); 
        exit(EXIT_FAILURE);
    }       
    else {            
        char c;
        int i=0;            

        while ((read(fd1, &c, 1) == 1) )
        {                
            firstline[i++]=c;                
            if(c=='\n')
            {
                //printf("end of line"); 
                printf("%s",firstline);
            }

        }
    }
    int close(int fd1);         
    return 0;        
}

ПРИМЕЧАНИЕ: Я НЕ ХОЧУ использовать fopen, fgets, sscanf или getline.Любая помощь будет оценена

Ответы [ 4 ]

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

Вот пример для демонстрации торможения из первого цикла на вашем примере:

#define MAXLENGTH 80    
...

char  firstline[MAXLENGTH + 1] = {0};
char  secondline[MAXLENGTH + 1] = {0};
char  thirdline[MAXLENGTH + 1] = {0};  
....
else {            
    char c;
    int i=0;            
    while ((read(fd1, &c, 1) == 1 && i < MAXLENGTH)
    {                
        firstline[i++]=c;                
        if(c=='\n')
        {
            break; /* break from first loop */
        }
    }
    /* add a '\0' to the end of the string! */
    firstline[i] = '\0';
    //printf("end of line"); 
    printf("%s",firstline);
    i=0;            
    while ((read(fd1, &c, 1) == 1 && i < MAXLENGTH)
    {                
        secondline[i++]=c;                
        if(c=='\n')
        {
            break; /* break from second loop */
        }
    }
    /* add a '\0' to the end of the string! */
    secondline[i] = '\0';
    printf("%s",secondline);
    i = 0;
    int i=0;            
    while ((read(fd1, &c, 1) == 1 && i < MAXLENGTH)
    {                
        thirdline[i++]=c;                
        if(c=='\n')
        {
            break; /* break from third loop */
        }
    }
    /* add a '\0' to the end of the string! */
    thirdline[i] = '\0';
    //printf("end of line"); 
    printf("%s",thirdline);
}
...
0 голосов
/ 09 декабря 2018

Причина, по которой вы получаете ошибку, наиболее вероятна, потому что вы никогда не сбрасываете i обратно на 0, поэтому вы продолжаете читать более 80 символов в firstline

Что касается сохранения каждой строки в еесобственная строка, вам просто нужно использовать другие переменные, вместо того, чтобы использовать firstline все время.

Есть несколько способов сделать это:

  1. Когдавы обнаруживаете конец строки, выход из цикла (с помощью break) и запускаете другой цикл, в котором вы будете помещать символы в secondline.Сделайте то же самое для третьего.

  2. Если вы уже немного узнали об указателях, вы можете сохранить один цикл, но использовать дополнительную переменную, такую ​​как char *currentLine, которая будет содержать адресмассив, который вы хотите прочитать в.Меняйте адрес каждый раз, когда вы обнаруживаете конец строки, например: currentLine = secondline.

Также не забывайте ставить '\ 0' в конце каждой прочитанной строки, иначе ваша программа можетпечатать мусор при попытке вывести на экран то, что вы прочитали.

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

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

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. правильная проверка и обработка ошибок
  4. дает "магию"'числа (3, 80) значащих имен

и теперь предлагаемый код:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>

#define MAX_LINES 3
#define MAX_LINE_LEN 80


int main( int argc, char *argv[] )  
{
    char Lines[ MAX_LINES ][ MAX_LINE_LEN ] = { '\0' };


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

    // implied else, correct number of command line arguments


    int fd1 = open(argv[1], O_RDONLY );  

    if (fd1 ==-1) 
    { 
        perror( "open failed" ); 
        exit(EXIT_FAILURE);
    }  

    // implied else, open successful        

    char c;

    for( int i = 0; i < MAX_LINES; i++ )
    {
        for( int j=0; j< MAX_LINE_LEN; j++ )
        {
            ssize_t bytecount = read(fd1, &c, 1 );
            if( bytecount < 0 )
            {
                perror( "read failed" );
                close( fd1 );
                exit( EXIT_FAILURE );
            }

            // implied else, read successful 

            Lines[ i ][ j ] = c;

            if( c == '\n' )
            {
                break;
            }   
        } 
    }

    for( int i = 0; i< MAX_LINES; i++ )
    {
        printf( "%s\n", Lines[i] );
    }

    close( fd1 );         
    return 0;        
}

Примечание: в этом коде предполагается, что каждая строка содержит менее 80 символов

запуск предложенного кода для собственного исходного файла приводит к:

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>
0 голосов
/ 09 декабря 2018

printf печатается до тех пор, пока не будет замечен завершающий символ NULL.Ваш printf перебирает нераспределенные области памяти, потому что вы не вставляете NULL (значение 0) в конец строки.Кроме того, вы забыли переинициализировать i в 0.

while ((read(fd1, &c, 1) == 1) )
{                
    firstline[i++]=c;                
    if(c=='\n')
    {
        firstline[i] = 0;
        i = 0;
        //printf("end of line"); 
        printf("%s",firstline);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...