не удается сбросить входной файл в обратном порядке

#c #c89

#c #c89

Вопрос:

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

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

int main() {
    char* c = malloc(10);
    char* c1 = malloc(10);
    char ch, arg1[100], arg2[100];
    int i, count = 0;
    FILE *fp, *fq;
    printf("Name of the file:");
    scanf("%s", arg1);
    fp = fopen(arg1, "w ");
    if (!fp) {
        perror("Failed to open file");
        return errno;
    }

    printf("ttt%snn", arg1);
    printf("ttInput the text into the filen");
    printf("ttPress Ctrl d to the stopn");
    while ((*c=getchar()) != EOF) {
        fwrite(c, 1, sizeof(c), fp);
        count  ;
    }

    printf("nn");
    fclose(fp);
    fp = fopen(arg1, "w ");
    printf("Name of the output file:");
    scanf("%s", arg2);
    printf("Reversing the contents of the file.......n");
    fq = fopen(arg2, "w ");
    printf("tt%snn", arg2);
    for (i = 1; i <= count; i  ) {
        fseek(fp, -(i   1), SEEK_END)
        fwrite(c1, 1, sizeof(c1), fq);
    }
    printf("Done....Opening the filen");
    rewind(fq);
    for (i = 0; i <= count; i  ) {
        ch = getc(fp);
        putc(ch, stdout);
    }
    fclose(fp);
    fclose(fq);
    return 0;
}
  

Комментарии:

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

2. Если содержимое файла невелико, вы можете захотеть загрузить все в память, а затем изменить его там. Это fseek(...) и затем rewind() выглядят ужасно неэффективными для меня.

3. у меня есть скомпилированная программа на моем Linux, и я не могу получить вывод перевернутого содержимого

4. я согласен с u abeln, но я сделал это намеренно, просто чтобы решить вопрос

5. c-faq.com/stdio/getcharc.html

Ответ №1:

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

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

/* get the size of the file. No error checking here! */
long get_filesize(FILE *fp)
{
    long fsize;

    fseek(fp, 0, SEEK_END);
    fsize = ftell(fp);
    rewind(fp);

    return fsize;
}

int main(int argc, char *argv[])
{
    if(argv[1] == NULL) return EXIT_FAILURE;

    FILE *input;
    unsigned char *data;
    long filesize;
    int i;

    /* open target file */
    input = fopen(argv[1], "rb");
    if(input == NULL) exit(EXIT_FAILURE);

    /* retrieve size of the file */
    filesize = get_filesize(input); 
    if(filesize < 1) exit(EXIT_FAILURE);

    /* allocate space for the file */
    data = malloc(filesize * sizeof(unsigned char));
    if(data == NULL) exit(EXIT_FAILURE);

    /* read the file into buffer and close the file handle */
    fread(data, filesize, sizeof(unsigned char), input);
    fclose(input);

    /* print the file content from end to beginning */
    for(i = --filesize; i >= 0; --i)
        putchar(data[i]);

    /* free the data buffer memory */
    free(data);

    return EXIT_SUCCESS;
}
  

Ввод текста:

 Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,
when an unknown printer took a galley of type and scrambled it to make a type
specimen book.
  

Выводимый текст:

 .koob nemiceps epyt a ekam ot ti delbmarcs dna epyt fo yellag a koot retnirp
nwonknu na nehw ,s0051 eht ecnis reve txet ymmud dradnats s'yrtsudni eht neeb
sah muspI meroL .yrtsudni gnittesepyt dna gnitnirp eht fo txet ymmud ylpmis si
muspI meroL
  

Комментарии:

1. @Athabaska, ваша программа обращается к памяти за пределами буфера, выделенного для data — вам нужно - 1 где-то там. Также нет причин умножать на sizeof(unsigned char) в malloc вызове — это всегда будет 1 .

2. Уже исправлено. Эта система stackoverflow отвратительна. Кто-то всегда комментирует в одно и то же время, когда я исправляю ошибки. Но без обид. Рад, что кто-то ловит эти неприятные ошибки C. Что касается sizeof(unsigned char) , обычно я добавляю его просто для переносимости. Я думаю, что это хорошая практика.

3. @Athabaska — не парься, просто пытаюсь помочь!

4. как мы можем использовать data [i], поскольку data является указателем на один символ, но компилятор не показывает ошибку

5. Я устал от всех, кто жалуется на это. Я лично добавляю это for clarity , как и многие другие программисты. В stackoverflow по этому поводу ведутся бесконечные флейм-войны.