Основной файл ввода-вывода в C Производит все - PullRequest
0 голосов
/ 28 марта 2019

Я использую CodeBlocks в Windows для компиляции.

Почему программа дает мне этот ответ? Почему так много a с, а ответа нет 123456abcdef?

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

int main(void) {
    FILE *fp;
    char s[100] = "abcdef";
    char c1 = '0';
    int i = 0;

    fp = fopen("ot.txt", "w");
    if (fp == NULL) {
        printf("file open error");
        exit(0);
    }

    while (s[i] != '\0') {
        fputc(s[i], fp);
        i++;
        printf("%d", i);
    }

    while (c1 != EOF) {
        c1 = fgetc(fp);
        putchar(c1);
    }
    fclose(fp);
}

1 Ответ

0 голосов
/ 28 марта 2019

В вашем коде несколько проблем:

  • c1 должен быть определен с типом int для учета всех значений, возвращаемых fgetc(). char не может однозначно хранить EOF.
  • Вы должны открыть файл в режиме записи + обновления "w+"
  • Вы должны перематывать указатель потока перед чтением из него по двум причинам: между операциями чтения и записи требуется операция поиска, и вы хотите прочитать символы с начала файла.
  • Вам нужно проверить EOF после чтения байта с помощью fgetc(), в противном случае вы будете выводить EOF, преобразованное в unsigned char в stdout перед выходом из цикла.
  • Это хороший стиль для return 0; из main() для обозначения успеха и ненулевое значение для обозначения ошибки.

Вот исправленная версия:

#include <stdio.h>

int main(void) {
    FILE *fp;
    char s[] = "abcdef";
    int i, c;

    fp = fopen("ot.txt", "w+");
    if (fp == NULL) {
        printf("file open error\n");
        return 1;
    }

    i = 0;
    while (s[i] != '\0') {
        fputc(s[i], fp);
        i++;
        printf("%d", i);
    }

    rewind(fp);
    while ((c1 = fgetc(fp)) != EOF) {
        putchar(c1);
    }
    printf("\n");
    fclose(fp);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...