Как читать как из пользовательского ввода, так и из txt файла - C Консоль - PullRequest
1 голос
/ 27 февраля 2020

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

Пока что он хорошо читает вводимые пользователем данные. Мне просто интересно, есть ли способ для программы читать из файла .txt. Таким образом, текстовый файл, заполненный парами реальных чисел, разделенных запятыми.

Код:

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

void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

int partition(int arr[], int low, int high)
{
    int pivot = arr[high];    // pivot 
    int i = (low - 1);  // Index of smaller element 

    for (int j = low; j <= high - 1; j++)
    {
        // If current element is smaller than the pivot 
        if (arr[j] < pivot)
        {
            i++;    // increment index of smaller element 
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

void quickSort(int arr[], int low, int high)
{
    if (low < high)
    {
        /* pi is partitioning index, arr[p] is now
           at right place */
        int pi = partition(arr, low, high);

        // Separately sort elements before 
        // partition and after partition 
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

void printArray(int arr[], int size)
{
    int i;
    for (i = 0; i < size; ++i)
        printf("%d ", arr[i]);

}
int main(int argc, char* argv[])
{

    int n1, n2;
    int x[10] = { 0 };
    int y[10] = { 0 };

    int capacity = 0;

    size_t n = sizeof(x) / sizeof(x[0]);
    int ch = 0;
    for (size_t i = 0; i < n; ++i)
    {

        scanf_s(" %d , %d ", &n1, &n2);
            x[i] = n1;
            y[i] = n2;

    }

    for (size_t j = 0; j < n; ++j)
    {
        printf("%d , %d\n", x[j], y[j]);

    }
    quickSort(x, 0, n-1);
    printArray(x, n);

    printf("Minimum is: %d", x[0]);
    printf("Maximum is: %d", x[n-1]);
    return 0;
}

Когда я пытался прочитать текстовый файл из моей программы с использованием CMD, он дает мне кучу числа.

-858993460 , -858993460
-858993460 , -858993460
-858993460 , -858993460
-858993460 , -858993460
-858993460 , -858993460
-858993460 , -858993460
-858993460 , -858993460
-858993460 , -858993460
-858993460 , -858993460

Полагаю, мне нужно использовать поток FILE * или что-то в этом направлении, однако я не уверен, как реализовать это с помощью fscan_s ...

1 Ответ

0 голосов
/ 27 февраля 2020

Разница между scanf_s и fscanf_s заключается просто в том, откуда они черпают информацию, как вы правильно сказали. первый идентификатор, переданный fscanf_s, является FILE * - указателем на файловый поток. Этот файловый поток инициализируется, и указатель получается через вызов fopen или вариант через возвращаемое значение. Если у вас есть этот указатель, вам просто нужно передать его в fscanf_s. Это должно выглядеть примерно так:

FILE *text_file = fopen("C:\Path\To\File.txt", "r"); //"r" == open for reading
if (text_file == NULL) //error in fopen() e.g. you don't have read permission or the file doesn't exist
{
    puts("error");
    return 1;
}
fscanf_s(text_file, format_string, varargs);

Примечание на основе вашего комментария. Было бы целесообразно извлечь данные из файла, указанного в командной строке, просто заменив путь к файлу в fopen() аргументом argv

К вашему комментарию:
Извините за медленный ответ. В документах говорится об fopen_s(), «более безопасной» версии fopen().

errno_t fopen_s(
   FILE** pFile,
   const char *filename,
   const char *mode
);

По сути, синтаксис немного другой. Вместо установки указателя FILE в качестве возвращаемого значения вы передаете указатель на этот указатель в качестве первого параметра. Использование выглядит следующим образом:

FILE *file_ptr;
errno_t check_this = fopen_s(&file_ptr, filename, mode);

Если вам нужна дополнительная информация о том, как работает передача указателя на указатель, просто спросите.

...