Получение подстроки строки из файла file.txt, прочитанного системным вызовом read - PullRequest
2 голосов
/ 01 марта 2020

Предположим, у нас есть файл lista.txt с таким содержанием:

John abc
Mark cdf
Susie hhh

как я могу получить первые слова каждой строки? (John и Mark и Susie)?

Это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

#define BUF_DIM 1000

struct elem{
    char nome[BUF_DIM];
};


int main() 
{
    int fileDescriptor;
    int nread;
    char carattere;
    char nickname[BUF_DIM];
    int i = 0, times = 0;

    struct elem *top = NULL;

    // Apertura del file in sola lettura
    if( (fileDescriptor=open("lista.txt", O_RDONLY)) == -1 ){
        perror("Errore con apertura del file");
        exit(1);
    }

    // Lettura del file
    while( read(fileDescriptor, &carattere, 1) == 1){ // un byte alla volta
        if (carattere != ' ') {
            times++;
            //printf("%c\n", carattere);
            nickname[i++] = carattere;
            //printf("%c\n", nickname[i++])
        }
        else {
            nickname[i++] = ' ';
        }
    }

    nickname[times] = '\0';

    printf("%s\n", nickname);


    close(fileDescriptor);

    return 0;
}

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Чтобы найти первое слово в каждой строке, сначала нужно разбить на строки. в конце каждой строки есть специальный символ. Вы можете найти его, сравнив с \n.

. Если вам нужно проанализировать все слова, выделите буфер, который может содержать 2 строки и читайте, пока не найдете \n. Затем проанализируйте строку в буфере и удалите ее.

Если вам нужно только первое слово, я предлагаю прочитать, пока не найдете пробел, а затем пропустите до \n.

0 голосов
/ 01 марта 2020

Использование read для чтения текстового файла очень громоздко. Было бы намного проще использовать стандартные функции потока: fopen() / fclose(), fgets() или даже fscanf().

Если вам необходимо использовать системный вызов read, я предлагаю вам реализовать функция, которая читает строку из текстового файла, читая по одному байту за раз с read копированием содержимого строки внутри l oop.

Обратите внимание, что perror("Errore in lettura"); не подходит, когда вы обнаруживаете ошибку записи .

...