Сохраните только второй элемент каждой строки из файла в вектор в c - PullRequest
1 голос
/ 24 марта 2020

У меня есть эта функция, которая сохраняет в целочисленной переменной все числа из текстового файла. Но я хочу внести изменения, чтобы я мог сохранить только второе число в каждой строке в векторе, а затем распечатать весь вектор. Вот пример file.txt:

123  19
321  18
432  9
876  16
875  17

А вот код, который необходимо изменить:

void LerVetor(int *V, int *N)
{
    FILE *fp;
    int marks;
    fp = fopen("dados3.txt", "r");

    if (fp == NULL)
        printf("Falha ao abrir ficheiro\n");

    rewind(fp);

    do
    {
        fscanf(fp, "%d", &marks);
        printf("%d\n", marks);

    } while (!feof(fp));

    fclose(fp);
}

Вывод такой же, как file.txt, потому что код просто печатает содержимое файла.

Резюме: сохранить только вторые числа каждой строки, например: 19, 18, 9 ..., в векторе, а затем распечатать вектор.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

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

  1. безупречная компиляция
  2. группирует переменные по месту их использования
  3. правильно проверяет и обрабатывает ошибки ввода-вывода
  4. читает / отображает второе число из каждой строки файла
  5. выполняет желаемую функциональность

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

#include <stdio.h>
#include <stdlib.h>


void LerVetor( void ) 
{
    FILE *fp = fopen("dados3.txt", "r");
    if( !fp )
    {
        perror("fopen to read: dados3.txt failed");
        exit( EXIT_FAILURE );
    }

    int marks;        
    int dummy;
    while( fscanf(fp, "%d %d", &dummy, &marks) == 2 )
    {
        printf("%d\n", marks);
    }

    fclose(fp);
}
1 голос
/ 24 марта 2020

Один из способов сделать это - передать указатель на вектор (массив целых чисел), в котором необходимо сохранить значения в качестве параметра функции.

Чтобы разместить первое значение в каждой строке Вы можете использовать спецификатор сброса %*d:

Live sample

#include <stdio.h>

void LerVetor(int* vector)
{
    FILE *fp; 

    if (!(fp = fopen("dados3.txt", "r"))){
        perror("Falha ao abrir ficheiro");        //print eventual open file error
        return;
    }

    // keep reading lines discarding first value with %*d avoiding container overflow
    for(int i = 0; fscanf(fp, "%*d %d", &vector[i]) == 1 && i < 100; i++) 
        printf("%d\n", vector[i]);                //printing vector values

    fclose(fp);
}

int main(void)
{
    int vector[100];
    LerVetor(vector);
    return 0;
}
...