Использование временного файла. Ошибка! - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Что здесь делаю не так? Нужно, чтобы прога убирала табуляцию и сохраняла в том же файле, из которого взяла текст.
    FILE *in,*tmp;
    char buf[200];
 
in=fopen("FirstFile.txt","rb");
tmp=tmpfile();
fseek(tmp,0l,SEEK_SET);
 
while (fgets(buf,200,in))
    if (buf[0]='\t')
         fputs(&buf[1],tmp);
     else
         fputs(&buf[0],tmp);
fclose(in);
 
in=fopen("FirstFile.txt","wb");
fseek(tmp,0l,SEEK_SET);
 
while (fgets(buf,200,tmp))
    if (buf[0]='\t')
         fputs(&buf[1],in);
     else
         fputs(&buf[0],in);
 
fclose(tmp);
fclose(in);

Решение задачи: «Использование временного файла. Ошибка!»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
int main(int argc, char ** argv){
    FILE * fin, * fout, *ftmp;
    char buf[BUFSIZ], * pbuf;
    
    if ( argc < 2 ){
        fprintf(stderr, "Usage: %s file_name\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ( ( fin = fopen(argv[1], "r") ) == NULL ){
        fprintf(stderr, "%s: can't open file %s for input!\n", argv[0], argv[1]);
        exit(EXIT_FAILURE);
    }
    if ( ( ftmp = tmpfile() ) == NULL ){
        fprintf(stderr, "%s: can't create tmp file!\n", argv[0]);
        fclose(fin);
        exit(EXIT_FAILURE);
    }
    
    while ( fgets(buf, BUFSIZ, fin) ){
        for ( pbuf = buf; *pbuf && isspace(*pbuf); ++pbuf )
            ;
        if ( fputs( ( *pbuf ) ? pbuf : "\n", ftmp) == EOF ){
            fprintf(stderr, "%s: can't write to tmp file!\n", argv[0]);
            fclose(fin);
            exit(EXIT_FAILURE);
        }
    }
    if ( ferror(fin) || fclose(fin) ){
        fprintf(stderr, "%s: error while reading file %s!\n", argv[0], argv[1]);
        exit(EXIT_FAILURE);
    }
    
    rewind(ftmp);
    if ( ( fout = fopen(argv[1], "w") ) == NULL ){
        fprintf(stderr, "%s: can't open file %s for output!\n", argv[0], argv[1]);
        exit(EXIT_FAILURE);
    }
    while( fgets(buf, BUFSIZ, ftmp) ){
        if ( fputs(buf, fout) == EOF ){
            fprintf(stderr, "%s: can't write to file %s!\n", argv[0], argv[1]);
            exit(EXIT_FAILURE);
        }
    }
    if ( ferror(ftmp) || fclose(ftmp) ){
        fprintf(stderr, "%s: error while reading tmp file!\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ( fclose(fout) ){
        fprintf(stderr, "%s: can't close file %s!\n", argv[0], argv[1]);
        exit(EXIT_FAILURE);
    }
    
    fprintf(stderr, "Done.\n");
    exit(EXIT_SUCCESS);
}

Объяснение кода листинга программы

  1. Объявление переменных:
    • fin (входной файл)
    • fout (выходной файл)
    • ftmp (временный файл)
    • buf (буфер для чтения)
    • pbuf (указатель на текущий символ в буфере)
  2. Проверка наличия достаточного количества аргументов (должно быть не менее 2).
  3. Открытие входного файла для чтения.
  4. Создание временного файла.
  5. Чтение входного файла построчно и запись в временный файл, удаляя лишние пробелы в конце каждой строки.
  6. Закрытие входного файла.
  7. Открытие выходного файла для записи.
  8. Чтение временного файла и запись в выходной файл.
  9. Закрытие временного файла.
  10. Закрытие выходного файла.
  11. Вывод сообщения об успешном выполнении.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы