Как прочитать 3 входных значения из файла и прочитать их последовательно? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь прочитать три значения из текстового файла (in.txt) из первой строки.Как я могу реализовать это в C?

Первая строка текстового файла состоит из 3 цифр (N, S, D).И они представляют последовательность входных слов в файле.Так, например, мой файл in.txt будет:

8 3 5
mary
tom
jane
joe
dave
judy
fred
bill
jane
jones
judy
mary
judy
fred
joe
dave

Таким образом, первый 8 будет соответствовать N, после 3 до S, а последний 5 до D.Цель для меня - добавить первый 8 в дерево двоичного поиска, затем следовать 3 для поиска в BST, а последний 5 удалить из BST.

Но для этого все, что я хочу знать, - это то, как я могу читать их из файла, чтобы запустить мой BST.

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

int main()
{
    FILE *inFile, *outFile; 
    int n, s, d; 

    inFile = fopen("in.txt", "r");

    while(!feof (inFile))
    {
        fscanf(inFile, "%d %d %d", &n, &s, &d);
    }
    fclose(inFile);
}

Это мой первый пост здесь на Stackoverflow, любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Для начала вам нужно просмотреть Почему while (! Feof (file)) всегда неверно?

При чтении строк данных из файла используйте Линейно-ориентированная функция ввода, такая как fgets() или POSIX getline() для чтения всей строки в буфер, а затем синтаксический анализ необходимых значений из буфера.Это обеспечивает два основных преимущества:

  1. , которые вы можете независимо проверить:

    a.чтение данных из файла;и

    б.парсинг значений из строки.

  2. то, что остается во входном буфере, не зависит от используемого спецификатора формата scanf .(целая строка всегда используется, поэтому вы всегда готовы читать с начала следующей строки для вашего следующего ввода)

Каждый раз, когда вы читаете из файла, просто укажитебуфер достаточного размера при использовании fgets (не экономьте на размере буфера!).POSIX getline автоматически выделит необходимое пространство.Затем используйте sscanf, чтобы проанализировать любую информацию, необходимую из строки (или strtok или strsep или любую другую функцию, которая вам нравится, чтобы найти определенную точку в буфере).

Если вы не анализируете информацию и вам нужна вся строка, просто обрежьте '\n' от конца буфера, перезаписав его nul-символом .strcspn предоставляет простой метод или используйте strlen, чтобы получить длину, а затем перезаписать последний символ.

В вашем случае вам просто нужно обработать первую строку иначе, чем остальные строки - так что оставьтесчетчик строк инициализируется нулем в начале.Если ваш счетчик строк равен нулю, то анализируйте 3-целочисленные значения из строки, в противном случае сделайте все, что вам нужно, с последующими строками (ниже они просто выводятся вместе с номером строки)

В целом,может сделать что-то похожее на:

#include <stdio.h>
#include <string.h>

#define MAXC 1024   /* don't skimp on buffer size */

int main (int argc, char **argv) {

    char buf[MAXC];     /* buffer to hold each line */
    int n, s, d;        /* your int variables */
    size_t ndx = 0;     /* line counter */
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (buf, MAXC, fp)) {     /* read each line into buf */
        if (!ndx) {     /* if 1st line, parse into n, s, d */
            if (sscanf (buf, "%d %d %d", &n, &s, &d) == 3)
                printf ("line[%2zu] - n: %d  s: %d  d: %d\n", 
                        ndx + 1, n, s, d);
            else {      /* if parse fails - handle error */
                fputs ("error: invalid format - line 1.\n", stderr);
                return 1;
            }
        }
        else {  /* for all subsequent lines */
            buf[strcspn(buf, "\r\n")] = 0;      /* trim '\n' from buf */
            printf ("line[%2zu] : %s\n", ndx + 1, buf);
        }
        ndx++;  /* increment line counter */
    }
    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    return 0;
}

Пример использования / Вывод

Используя ваш входной файл, вы получите следующее:

$ ./bin/rdline1_3int dat/line1_3int.txt
line[ 1] - n: 8  s: 3  d: 5
line[ 2] : mary
line[ 3] : tom
line[ 4] : jane
line[ 5] : joe
line[ 6] : dave
line[ 7] : judy
line[ 8] : fred
line[ 9] : bill
line[10] : jane
line[11] : jones
line[12] : judy
line[13] : mary
line[14] : judy
line[15] : fred
line[16] : joe
line[17] : dave
0 голосов
/ 15 апреля 2019

Я бы сделал что-то вроде этого:

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


void main()
{
int fd, N, S, D;
char buff[1];
fd = open("in.txt", O_RDONLY);


//reading N
if(read(fd, buff, 1) == -1){
    perror("Unable to read N");
    exit(0);
}
//converting N to int value
//EDIT
N = atoi(buff);

//skipping the file descriptor to avoid reading the space
lseek(fd, 1, SEEK_CUR);
//reading S
if(read(fd, buff, 1) == -1){
    perror("Unable to read S");
    exit(0);
}
//converting S to int value
//EDIT
S = atoi(buff);

//skipping the file descriptor to avoid reading the space
lseek(fd, 1, SEEK_CUR);
//reading D
if(read(fd, buff, 1) == -1){
    perror("Unable to read N");
    exit(0);
}
//converting D to int value
//EDIT
D = atoi(buff);;

close(fd);
//here your values are initialized
}

Я не тестировал этот код, поэтому он может не работать, дайте мне знать, если он работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...