Необработанное нарушение прав доступа при открытии потока файлов с помощью fopen_s - PullRequest
0 голосов
/ 16 октября 2018

У меня немало проблем с выяснением, почему мой код не работает.

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

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

В случае, когда я изменяю параметр потока FILE** на NULL вместо записи в fopen_s, я получаю ошибку подтверждения отладки.

Мне кажется, проблема в том, как я объявил мой указатель.

#include <.stdio.h>
#include <.conio.h>

int main()
{
    char * article[5] = { "the", "one","some","any","a" };
    char * noun[5] = { "boy","girl","dog","town","car" };
    char * verb[5] = { "drove","jumped","ran","walked","skipped" };
    char * preposition[5] = { "to","from","over","under","on" };
    int x = 0;
    char * output[100] = {0};

    //char output = { "" };

    FILE ** write = "C:\Users\dilli\Downloads\test.txt";

    while (5) {
        printf("Enter one(1) to output to screen, two(2) to output to file:\n");
        scanf_s("%d",&x);
        if(x==1)
            printf_s("%s %s %s %s %s %s.\n", article[rand() % 5], noun[rand() % 5], verb[rand() % 5],
                preposition[rand() % 5], article[rand() % 5], noun[rand() % 5]);
        else if (x == 2)
        {
            printf("Enter name of output file:\n");
            scanf_s("%s",&output,100);
            printf("output:\n%s",output);
            fopen_s(write,output, "w");//This is where we are getting an unhandled exception.
            fprintf("%s %s %s %s %s %s.\n", article[rand() % 5], noun[rand() % 5], verb[rand() % 5],
                preposition[rand() % 5], article[rand() % 5], noun[rand() % 5]);
            fclose(write);
        }
    }
}

1 Ответ

0 голосов
/ 16 октября 2018

Во-первых, вы не можете присвоить строковый литерал переменной FILE**.Это не должно даже компилироваться.И вы все равно даже не используете строковый литерал для чего-либо, поскольку вместо этого вы запрашиваете у пользователя имя выходного файла.Так что просто избавьтесь от строкового литерала.

Во-вторых, вы неправильно используете fopen_s() и scanf_s(), поэтому ваш код дает сбой.

  • При запросеПользователь для имени файла, вы просите scanf_s() читать в массив указателей, а не в массив символов.Это само по себе может привести к сбою или, по крайней мере, вызвать неопределенное поведение при попытке доступа к содержимому массива позже.

  • После этого вы передаете недопустимый указатель FILE**,и неверный массив char[], до fopen_s().Ожидается, что вы передадите указатель на допустимую переменную FILE* и строку char с нулевым символом в конце, а не массив char* указателей.

В-третьих, выне передавая открытые FILE* в fprintf() вообще.

С учетом сказанного попробуйте это вместо:

#include <stdio.h>
#include <conio.h>

int main()
{
    const char* article[5] = { "the", "one","some","any","a" };
    const char* noun[5] = { "boy","girl","dog","town","car" };
    const char* verb[5] = { "drove","jumped","ran","walked","skipped" };
    const char* preposition[5] = { "to","from","over","under","on" };
    char fileName[260] = {0};
    FILE *write = NULL;
    int i, x;

    for (i = 0; i < 5; ++i) {
        printf("Enter one(1) to output to screen, two(2) to output to file:\n");
        x = 0;
        scanf_s("%d", &x);
        if (x == 1) {
            printf_s("%s %s %s %s %s %s.\n", article[rand() % 5], noun[rand() % 5], verb[rand() % 5], preposition[rand() % 5], article[rand() % 5], noun[rand() % 5]);
        }
        else if (x == 2) {
            printf("Enter name of output file:\n");
            scanf_s("%s", fileName, 260);
            printf("output:\n%s", fileName);
            if (fopen_s(&write, fileName, "w") == 0) {
                fprintf(write, "%s %s %s %s %s %s.\n", article[rand() % 5], noun[rand() % 5], verb[rand() % 5], preposition[rand() % 5], article[rand() % 5], noun[rand() % 5]);
                fclose(write);
            }
        }
    }

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