Почему я получаю отчет о сбое с argv в этом примере? - PullRequest
0 голосов
/ 03 июня 2018

TL; DR

• 1. Почему этот код выдает ошибку сбоя при запуске?

• 2. Что argv[] делает?Это получает ваш ввод cmd?И чем он отличается от argv 1,2,3 ... и так далее?

• 3. Вывод не показывает, что ожидается при изменении argv[1] на VSF.txt

Следующий код выдает ошибку:

File: minkernel\crts\ucrt\src\appcrt\stdio\fopen.cpp
Line: 30
Expression file_name != null_ptr

error image

Идея состоит в том, чтобы напечатать каждую строку файла с соответствующим номером.Я еще не до конца понимаю файлы, и я верю, что argv[1] это то, что вы пишете в приглашении компилятора, верно?Как это дифференцировать с argv 1,2,3 ... и так далее?

Если я изменяю argv[1] на VSF.txt (имя файла), он показывает странные символы (не то, что внутри VSF.txt)

VSF.txt image

cmdoutput

Вывод показывает все с одной строкой, без пробела и строковая переменная не увеличивается;почему не печатается содержимое VSF.txt?

#define _CRT_SECURE_NO_WARNINGS

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

main(int argc, char *argv[])
{
    FILE *file = stdout;
    int lines = 1, start = 1;
    char ch;

    if ((file = fopen(argv[1], "r")) == NULL)
    {
        printf("Impossivel de abrir o arquivo :%s", argv[1]);
        exit(0);
    }
    while (ch = fgetc(file) != EOF)
    {
        if (ch == '\n')
        {
            lines++;
            start = 1;
        }
        else if (start == 1)
        {
            printf("%d: ",lines);
            putchar(ch);
            start = 0;
        }
        putchar(ch);
    }
    fclose(file);
}

1 Ответ

0 голосов
/ 03 июня 2018

Проблема со странным выводом здесь:

while (ch = fgetc(file) != EOF)

Оператор неравенства != имеет более высокий приоритет, чем оператор присваивания =.Таким образом, приведенное выше выражение такое же, как:

while (ch = (fgetc(file) != EOF))

Это присваивает ch логическое значение, 0 или 1. Вот почему вы получаете результат, который получаете.Поставьте круглые скобки в нужное место:

while ((ch = (fgetc(file)) != EOF)

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

archives VSF.txt

Если вы запустите его из Visual Studio, перейдите в настройки проекта и в разделе «Отладка» установите «Аргументы команд» для VSF.txt.

...