Почему этот код записывает ввод во второй строке?

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


void main() {

    FILE* fp;
    char line[1024];
    char filename[1024];
    int length;
    int counter=0;

    while (1) {
       // fopen(filename, "w");
        int op = 0;
        printf("1. new file");
        scanf("%d", &op);

        switch (op) {

        case -1: break;
        case 1:

            printf("filename>>");
            scanf("%s", filename);
            length = strlen(filename);
            printf("length = %ld \n", strlen(filename));
            filename[length] = '.';
            filename[length + 1] = 't';
            filename[length + 2] = 'x';
            filename[length + 3] = 't';
            filename[length + 4] = '\0';

            fp=fopen(filename, "w");

            while (fgets(line, sizeof line, stdin) != NULL)
            { 
                if (line[0] == 'q' || line[0] == 'Q')
                {
                    printf("end of line \n");
                    fclose(fp);
                    break;
                }
                else
                    fputs(line, fp);
            }
        }
    }
}

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

Почему это происходит? Я хочу написать ввод с первой строки. Как изменить этот код, чтобы он работал в первой строке?


person masterbeard7    schedule 21.05.2020    source источник
comment
Я читал это, но я не могу понять полностью.   -  person masterbeard7    schedule 21.05.2020


Ответы (2)


Вероятная причина в том, что вы используете fgets сразу после scanf на стандартном вводе.

См. раздел Использование scanf и fgets в одной программе?.

person pifor    schedule 21.05.2020

scanf("%s", filename);

Когда вы вводите имя файла с клавиатуры, вы вводите имя файла, а затем нажимаете ENTER. Функция scanf считывает filename, но не использует символ ENTER. Затем, когда вы используете fgets, он будет читать этот символ ENTER, а затем записывать пустую строку в ваш файл.

Чтобы решить эту проблему, вы можете использовать getchar() после scanf("%s", filename); для использования символа ввода. Вы должны добавить 1023 перед %s в функцию scanf: Недостатки scanf.

scanf("%1023s", filename);
getchar();

Или вместо этого вы можете использовать fgets:

fgets(filename, sizeof(filename), stdin);

Еще одна вещь, оператор break в switch не поможет вам выйти из первого цикла while (while (1) {...}). Вы должны использовать одно условие для выхода из этого цикла, например:

char ch = 'a';
while (ch != 'q') {

  ...
  switch (op) {
      case -1: ch = 'q'; break; // type -1 will exit the first while loop.

switch должен иметь случай default для исключения.

 switch (op) {
    ...
    default:
       // handle the exception here.
person Hitokiri    schedule 21.05.2020