Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
dioxa1020
1 / 1 / 0
Регистрация: 18.02.2013
Сообщений: 9
#1

Редактирование текстового файла

12.04.2013, 15:11. Просмотров 790. Ответов 6
Метки нет (Все метки)

Ребят помогите. Имеется такое задание: Если в строке четное количество слов, то удаляется каждое второе слово, при этом количество пробелов в строке не должно измениться.

Я набросал текст программы, но не могу сделать так чтобы программа читала большие тексты со множеством строк. У меня нужную операцию проводит только с одной строкой.
Помогите подправить.

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
#include <stdio.h>
main(){
 FILE *in_file, *out_file;
 char file_name[1024]; /*текстовый файл*/
 char result[1024]; /*выходной файл*/
 char str[1024]; /*текс в файле*/
 char s [1024];
 char tm;
 int space=0;
 int reading_word = 0,/*чтение символов в слове*/
 word_cnt = 0,/*количество слов в строке*/
 i,nw=0,iw=0,t=0;
 
 printf("\n Имя файла:");
 gets(file_name);
 
 in_file=fopen(file_name,"rt");
 if(in_file==NULL){
  printf("Ошибка открытия файла %s",file_name);
  return 1;
 }
 while(feof(in_file)==0){
  if(fgets(str,1024,in_file)!=NULL){
   printf("%s \n\n",str);
  }
   }
    for (i=0; i<strlen(str); i++)
    {
        if (str[i] == ' ')
        {
            space = space+1;
            reading_word = 0;
        } else {
            if (reading_word == 0)
            {
                word_cnt++;
            }
 
            reading_word = 1;
        }
    }
      printf("Число слов равно %d\n", word_cnt);
    if (word_cnt%2 == 0)
    {
        tm=str[0]; str[0]=' ';
    for(i=1;i<strlen(str)+1;i++)
    {
        if(str[i]!=' ' && str[i-1]==' ') { nw++; iw=1; };
        if(str[i-1]!=' ' && str[i]==' ') iw=0;
        if( !(iw==1 && nw%2==0) || str[i]=='\0') s[i-t]=str[i];
            else t++;
    }
    }
    else printf("число слов в строке нечетное\n");
 
 
    out_file=fopen("result.txt","wt");
    fprintf(out_file,"%s \n",s);
    printf("%s \n",s);
    fclose(out_file);
    fclose(in_file);
}
Добавлено через 18 часов 55 минут
Вверх

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

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2013, 15:11
Ответы с готовыми решениями:

Запросить имя текстового файла и вывести на экран количество компонентов файла
Запросить имя текстового файла и вывести на экран количество компонентов файла....

Редактирование файла
Имеется файл с информацией, написанный по строкам. Нужна программа, которая...

Редактирование файла hosts через консоль
Помогите пожалуйста!мне нужна помошь, хочу создать прогу через которую можно...

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

Чтение из файла в C, редактирование его и запись в новый файл
В общем, задача такая: Программе на вход подается исходный текст какой-нибудь...

6
bgm123
40 / 40 / 27
Регистрация: 29.01.2013
Сообщений: 277
12.04.2013, 23:46 #2
Вот так попробуй:


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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
 
#define ERROR_OPEN_FILE 1
#define SIZE_NAME 1024
#define END_FILE 1
 
//возвращает количество слов в текущей строке файла fp
int countWord(FILE *fp, long *off_set);
 
//записывает одну строку из файла in в выходной файл out
int oneStr(FILE *in, FILE *out);
 
int main(void)
{
    FILE *in_file, *out_file;
    char name_file[SIZE_NAME];
 
    printf("enter path to input file: ");
    gets(name_file);
            
    if( (in_file = fopen(name_file, "rb")) == NULL)
        exit(ERROR_OPEN_FILE);
 
    if( (out_file = fopen("result.txt", "wb+")) == NULL)
        exit(ERROR_OPEN_FILE);
 
    while(oneStr(in_file, out_file) != END_FILE)
        ;
    
    fclose(in_file);
    fclose(out_file);
    
    return 0;   
}
 
int countWord(FILE *fp, long *off_set)
{
    int count = 0;
    char ch, chNext;
    int lenStr = 1;
    
    ch = fgetc(fp);
    if(!isspace(ch)) count++;
 
    while(ch != '\n' && !feof(fp)){
        lenStr++;
        chNext = fgetc(fp);
        if(isspace(ch) && !isspace(chNext))
            count++;
        ch = chNext;
    }
 
    *off_set = lenStr;
    fseek(fp, -lenStr, SEEK_CUR);
 
    return count;
}
 
int oneStr(FILE *in, FILE *out)
{
    long offset;
    int count_word = countWord(in, &offset);
    int i, id_word;
    char ch, chNext;
    
    if(count_word % 2){
        for(i = 0; i < offset; i++){
            ch = fgetc(in);
            fputc(ch, out);
        }
        return;
    }
        
    ch = fgetc(in);
    id_word = isspace(ch) ? 1 : 0;
    
    for(i = 0; i < offset && !feof(in); i++){
        chNext = fgetc(in);
        if(isspace(ch) && !isspace(chNext))
            id_word = (++id_word) % 2;
        if(!isspace(ch) && id_word){
            ch = chNext;
            continue;
        }
        
        putc(ch, out);
        ch = chNext;
    }
    
    fseek(in, -1, SEEK_CUR);
 
    if(feof(in)) return END_FILE;
    else return !END_FILE;
}
0
dioxa1020
1 / 1 / 0
Регистрация: 18.02.2013
Сообщений: 9
13.04.2013, 13:42  [ТС] #3
В файле с результатом, после отредактированного текста, вводится бесконечное количество точек.
Как это исправить?
0
bgm123
40 / 40 / 27
Регистрация: 29.01.2013
Сообщений: 277
13.04.2013, 17:32 #4
Покажите код, который используете. Мой код у меня работает!
0
dioxa1020
1 / 1 / 0
Регистрация: 18.02.2013
Сообщений: 9
13.04.2013, 19:19  [ТС] #5
Использую ваш код. Запускаю программу, вбиваю имя текстового файла который находится в папке с проектом. Жму энтер и программа зависает. В папке появляется файл с результатом, но пока не закроешь программу, принудительно, она вбивает точки.
0
bgm123
40 / 40 / 27
Регистрация: 29.01.2013
Сообщений: 277
13.04.2013, 19:25 #6
У вас вирусы наверно))

Добавлено через 21 секунду
Скопируйте нормально и всё))

Добавлено через 3 минуты
У меня всё работает) Попробуйте запустить в отладочном режиме и посмотреть откуда берутся эти точки.
1
dioxa1020
1 / 1 / 0
Регистрация: 18.02.2013
Сообщений: 9
14.04.2013, 20:05  [ТС] #7
Не понятно вообще что такое Последний символ так и вбивается бесконечное число раз.
0
14.04.2013, 20:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 20:05

Удаление комментария из текстового файла
Здравствуйте. Возникли затруднения программой для удаление комментария /*...*/...

Построчная обработка текстового файла
Есть некий текстовый файл, состоящий из блоков по 10 строк. Между блоками -...

Подсчёт символов из текстового файла
ПРивет всем! как сделать чтобы программа считывала символы, строки, слова не из...


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

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

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