Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
#1

Чтение из файла в C, редактирование его и запись в новый файл - C (СИ)

27.03.2010, 22:11. Просмотров 35396. Ответов 14
Метки нет (Все метки)

В общем, задача такая: Программе на вход подается исходный текст какой-нибудь программы на С..
Нужно удалить из него все комментарии. Впервые мне дали задание, где нужно применять работу с файлами, подскажите, пожалуйста - как открыть файл? И как с ним работать? обычный текст.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2010, 22:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из файла в C, редактирование его и запись в новый файл (C (СИ)):

Чтение из файла и запись в файл - C (СИ)
скажите пож-та если у меня например есть текстовый файл и в нем записаны ФИО студентов ,оценки из пяти символов у каждого ,номер...

Чтение-запись из файла в файл - C (СИ)
Написать 2 программы копирования файлов. Имена файлов для копирования задаются в командной строке: причем 1-ый аргумент – это имя файла...

Построчное чтение из файла, заполнение структуры и запись в бинарный файл - C (СИ)
Здравствуйте. Пытаюсь сделать чтение из текстового файла построчно, а затем сразу забиваю в структуру полученное и пишу в бинарный...

Запись в файл отдельных строк и чтение строки с определённым номером из файла - C (СИ)
Друзья, нужна помощь в написании программы, которая позволяет записывать в файл отдельные строки, вводимые пользователем и читать строку с...

Бинарное дерево поиска. Как осуществить запись в файл и чтение из файла - C (СИ)
Добрый день! Если кому не жаль своего времени окажите помощь! Необходимо осуществить запись в файл,просмотр содержимого файла, и создание...

Запись текста в файл\вывод его на экран\сохранение\считывание информации из файла - C (СИ)
Ввести текст произвольного содержания в память ПЭВМ. Вывести на экран. Записать текст в файл. После записи текста в файл информация...

14
maxik42
4 / 19 / 3
Регистрация: 22.03.2010
Сообщений: 131
27.03.2010, 22:36 #2
Цитата Сообщение от farewell Посмотреть сообщение
В общем, задача такая: Программе на вход подается исходный текст какой-нибудь программы на С..
Нужно удалить из него все комментарии. Впервые мне дали задание, где нужно применять работу с файлами, подскажите, пожалуйста - как открыть файл? И как с ним работать? обычный текст.
Обьявить f: FILE *f;
f - указатель на файл.
Открываем файл f=fopen("название файла","символ");
символы там разные но основные это "r" и "w".
fprintf(); - запись в файл.
fscanf(); - считывание из файла.
fputs(); - запись строки.
fgets(); - считывание строки.
Закрытие fclose(f);
если что в хелпе можно покопатся по етим функциям!
1
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
27.03.2010, 22:43  [ТС] #3
Спасибо!)
Но вот когда я открыл файл.. как мне, например, удалить из него все буквы "А"?

C
1
2
3
f: FILE *f;
f = fopen("text.txt","r");
//... а дальше? Текст из открытого файла где хранится? в массиве каком, что ли?) вот тут непонятно, как редактировать открытый текст :)
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
27.03.2010, 23:09 #4
farewell, наверно так
C
1
2
3
while((c=getc(f)!=EOF){
if(c=='a')c=" ";
}
зы не проверял
0
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
28.03.2010, 00:19  [ТС] #5
не пашет..
Фатальная ошибка, всем хана.
1
maxik42
4 / 19 / 3
Регистрация: 22.03.2010
Сообщений: 131
28.03.2010, 01:05 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от farewell Посмотреть сообщение
Спасибо!)
Но вот когда я открыл файл.. как мне, например, удалить из него все буквы "А"?

C
1
2
3
f: FILE *f;
f = fopen("text.txt","r");
//... а дальше? Текст из открытого файла где хранится? в массиве каком, что ли?) вот тут непонятно, как редактировать открытый текст :)
Очень просто! нужно просканировать первый файл и создать новый и уже в него записать без букв А!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
main()
{
  FILE *in,*out;
  char c;
 
  in=fopen("data","r");//Тут еще нужно бы было проверять возвращаемое значение при открытии файлов
  out=fopen("data2","w");
 
  while ( (c=fgetc(in) ) != EOF)//считываем символ из файла data в переменную c до символа EOF.
    {
       if ( c != 'A' )              //игнорируем все символы А.
            fputc( c,out );//записываем переменную в файл data2.
    }
 
  fclose(out);//проверить код закрытия или удачно закрыты файлы!
  fclose(in);
 
}
4
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
28.03.2010, 23:14  [ТС] #7
Выдает ошибку дебагера, даже не в окне ошибок, а вылезает отдельное виндовое олдскульное окошко: типа
Expression: (stream != NULL)
0
maxik42
4 / 19 / 3
Регистрация: 22.03.2010
Сообщений: 131
29.03.2010, 00:36 #8
Цитата Сообщение от farewell Посмотреть сообщение
Выдает ошибку дебагера, даже не в окне ошибок, а вылезает отдельное виндовое олдскульное окошко: типа
Expression: (stream != NULL)
А у вас какой компилятор?
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
29.03.2010, 05:28 #9
Цитата Сообщение от farewell
В общем, задача такая: Программе на вход подается исходный текст какой-нибудь программы на С..
Нужно удалить из него все комментарии.
там работы с файлами нет
Код
cat file.c | ./prog > output.c
для виндовс
Код
type file.c | prog.exe > output.c
для начала, конечно, лучше сделать на файлах

Добавлено через 2 минуты
когда файлов нет, там обычный поток ввода и поток вывода
0
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
29.03.2010, 10:44  [ТС] #10
Ура, всё получилось! Спасибо огромное!
Уже делаю задание, столкнулся с такой проблемой:
Как удалить комментарий типа /* ..... */ ?
Сумел написать проверку на "/*":

C
1
2
3
4
5
6
7
8
9
10
11
12
  FILE *in,*out;
  char c;
 
  in=fopen("data.txt","r");
  out=fopen("data2.txt","wb");
 
  while ( (c=fgetc(in) ) != EOF)
        {
           if ( c != '/' )
           {     fputc( c,out );}
           else { if((c=fgetc(in))='*') {printf("Вот и комментарий!");}}
        }
Но этот кусок кода, как только наткнется на /*, сразу удаляет всё до конца файла. Что делать?)
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
30.03.2010, 04:49 #11
а если слеш не является частью комментария
0
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
30.03.2010, 20:05  [ТС] #12
Уже исправил) Тут теперь новая проблема.. Вот код, удаляющий однострочные комменты:
C
1
2
3
4
5
6
7
8
9
10
11
12
 while ( (c=fgetc(in) ) != EOF) // пока файл не кончится
        {
            if(c=='/') { 
                if(c=getc(in)=='/') { //если следуют две косые палки подряд
                printf("Found a start of comment.\n");
                while((c=fgetc(in)!='\n')) {} //Пропускаем текст коммента..
                printf("Comment ended. I will continue..\n"); }//камент кончился
                else {fputc(c,out);}
            }
            else {fputc(c,out);}
 
        }
Так эта сволочь, удалив однострочный коммент, удаляет и символ /n, то есть если было так:
C
1
2
int i; //asasas
int j;
То после работы программы получается вот что:
C
1
int i;int j;
Что делать? Почему-то fputc('\n',out) не помогает.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
31.03.2010, 03:31 #13
с однострочными то же самое
C
1
int a = b / 2;
съедает /

Цитата Сообщение от farewell
Почему-то fputc('\n',out) не помогает.
делай отступы, чтобы сразу видеть, что к чему относится, а что к чему не относится

C
1
2
3
4
5
6
7
8
9
10
11
12
    while ((c = fgetc(in)) != EOF) { // пока файл не кончится
        if (c == '/') { 
            if ((c = getc(in)) == '/') { //если следуют две косые палки подряд
                printf("Found a start of comment.\n");
                while ((c = fgetc(in)) != '\n')
                    ; //Пропускаем текст коммента..
                printf("Comment ended. I will continue..\n"); //камент кончился
            } else
                fputc(c,out);
        } else
            fputc(c,out);
    }
там несколько ошибок было со скобками
вот теперь видно, где нет вывода '\n'
0
Tarasishche
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1
25.04.2010, 01:15 #14
А можно код целиком....особенно интересует часть с удалением коментов типа /*-----*/
Ато та же праблема)
0
Xorazm
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 32
24.06.2017, 05:28 #15
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
 
int getch( )
{
   struct termios oldt, newt;
   int ch;
   tcgetattr( STDIN_FILENO, &oldt );
   newt = oldt;
   newt.c_lflag &= ~( ICANON | ECHO );
   tcsetattr( STDIN_FILENO, TCSANOW, &newt );
   ch = getchar();
   tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
   return ch;
}
 
#define ERROR_FILE_OPEN -3
#define BUFFER_SIZE 8096
 
 
const char* read_filename(void)
{
   static char filename[1001];
   scanf("%1000s", filename);
   return filename;
}
 
int main()
{
   FILE *origin = NULL;
   FILE *output = NULL;
 
   const char* filename;
   int mode;
   printf("Введите Имя файла: ");
   filename = read_filename();
   origin = fopen(filename, "r");
   if (origin == NULL) {
      printf("Ошибка при открытии файла!%s", filename);
      getch();
      exit(ERROR_FILE_OPEN);
   }
 
   printf(" Введите: [1-копия,2- читать,3- удалить, 4- записать, 5- выход] ");
   scanf("%d", &mode);
  output = stdout;
   switch (mode) {
   case 5:
   default:
      printf("Покедова!\n");
      break;
 
   case 3: {
         fclose(origin);
         if (remove(filename)) {
            printf("Ошибка при удалении: %s\n", strerror(errno)); exit(1);
         };
         printf("%s удалён\n", filename);
      }
      break;
 
   case 4: {
         origin = freopen(filename, "a", origin);
         printf("Введите текст для записи в конец файла %s,\n"
                "для завершения нажмите Ctrl-D на пустой строке\n", filename);
         int cnt = 0;
         while (!feof(stdin)) {
            fprintf(origin, "%c", fgetc(stdin));
            cnt++;
         }
         fclose(origin);
         printf("\n%d байт записано.\nПокедова...\n", cnt);
      }
      break;
 output = stdout;
   case 1:
      printf("Введите Имя файла: ");
      filename = read_filename();
      output = fopen(filename, "w");
      if (output == NULL) {
         printf("Ошибка при открытии файла! %s", filename);
         getch();
         fclose(origin);
         exit(ERROR_FILE_OPEN);
      }
      
   case 2:
     
 
      while (!feof(origin)) {
         fprintf(output, "%c", fgetc(origin));
      }
      fclose(origin);
      fclose(output);
      printf("готово!\n");
      break;
   }
 
      getch();
      return EXIT_SUCCESS;
}
4 в одном что бы не париться
0
24.06.2017, 05:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2017, 05:28
Привет! Вот еще темы с ответами:

Дан текстовый файл. Переписать в новый файл все его строки четной длины - C (СИ)
помогите написать программу заранее спасибо Дан текстовый файл. Переписать в новый файл все его строки четной длины.

Запись и чтение из файла - C (СИ)
Наверное глупый вопрос, но пожалуйста, подскажите как правильно считывать из файла, если в файле хранятся значения разных переменных и...

Запись/чтение из файла - C (СИ)
#include &lt;stdio.h&gt; main() { char product_name; int product_mass; int product_price; ...

Создание, Чтение, Запись в файл - C (СИ)
Здравствуйте! В задание говорится о двух файлах FileMathA.txt и FileMathB.txt содержащие матрицу 10х10 заполненные числами 1 2 3...n...98...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.