2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Работа с файлами. С
Сообщение09.06.2018, 17:13 


16/12/17
27
Здравствуйте! У меня никаких ошибок не выдает, но записывается в файл g совсем не то, что надо. Еще какие-то неизвестные значения. Что не так?
код: [ скачать ] [ спрятать ]
Используется синтаксис C
//Дан текстовый файл f, состоящий из нескольких строк.
//Пользователь вводит символ, начиная с которого в каждой строке исходного файла строчные латинские буквы преобразуются в прописные.
//Строки, в которых проведены такие преобразования, записываются в новый файл g. В конце строки через пробел проставляется количество преобразований.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char to_upper(char c){
        int dif = 'A' - 'a';
       char sym = c + dif;
        return sym;
}

char* process_string(char* s, char user_char, int* count){
        int n = strlen(s);
        int i = 0;
    char *a;
    a = (char*)malloc(1000*sizeof(char));
    strcpy(a, s);
        int flag = 0;
        for(i = 0; i < n; i++){
                if(flag == 0 && s[i] == user_char){
                    flag = 1;
}
                if('a'<=s[i] && s[i]<='z' && flag == 1)
               {
                   *(count)++;
                   a[i] = to_upper(s[i]);
               }
}
        return a;
}

void file_process(){
        FILE *f;
    FILE *g;
    char *mass;
    mass = (char*)malloc(1000*sizeof(char));
    char user_sym;
    int count=0;
    f=fopen("file_b","r");
    g=fopen("file_b_new", "w");
    printf("Введите символ:\n");
    scanf("%c", &user_sym);
    while(fscanf(f, "%s", mass)==1)
    {
                mass = process_string(mass, user_sym, &count);
        fprintf(g, "%s", mass);
        fprintf(g, "%d", count);
     }
     fclose(g);
     fclose(f);
}

int main(){
        file_process();
        //free(a);
        return 0;
}

 

Дан файл f, пользователь вводит "h"
Используется синтаксис C
a hello I house
rrrr ttt uu
hhh iii
 

Что выводит в файле g :
Используется синтаксис C
a0HELLO0I0HOUSE0rrrr0ttt0uu0HHH0iii0
 

Должно быть:
Используется синтаксис C
a HELLO I HOUSE
HHH III 16
 

 Профиль  
                  
 
 Posted automatically
Сообщение09.06.2018, 17:24 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Помогите решить / разобраться (М)» в форум «Карантин»
Приведите тестовый пример: что обрабатывает программа, что должно получиться, что получается в действительности.

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение09.06.2018, 17:39 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Программирование»

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 17:48 
Заслуженный участник


20/08/14
11778
Россия, Москва
alexrr в сообщении #1318460 писал(а):
Используется синтаксис C
*(count)++;
Это выражение неправильно, тут не увеличение переменной по указателю, а увеличение самого указателя.

Ну и записи в выходной файл пробелов и переводов строк просто нет.

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 17:51 
Заслуженный участник


09/05/12
25179
Интересно, в описании задания и программе файлы названы по-разному, чтобы интереснее было? :facepalm:

Ну а ошибки... Во-первых, посмотрите, что Вы делаете при увеличении счетчика (особенно полезно подумать о приоритете операций). Во-вторых, в каком конкретно месте обрабатывается ситуация, когда символ не является буквой?

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 17:52 
Заслуженный участник


02/08/11
7003
alexrr в сообщении #1318460 писал(а):
*(count)++;
Весьма изощрённое издевательство над читателем кода. (Неиздевательством было бы либо (*count)++, либо *(count++).)

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 18:04 
Заслуженный участник


20/08/14
11778
Россия, Москва
Pphantom в сообщении #1318474 писал(а):
Во-вторых, в каком конкретно месте обрабатывается ситуация, когда символ не является буквой?
Дык там изначально strcpy стоит ...

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 18:17 
Заслуженный участник


09/05/12
25179
Dmitriy40 в сообщении #1318478 писал(а):
Дык там изначально strcpy стоит ...
И как, помогает? :wink:

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 18:35 
Заслуженный участник


20/08/14
11778
Россия, Москва
Pphantom
Ну по идее должно, ведь прочие символы останутся как есть. Впрочем я код не запускал и не проверял.
Или не понял смысл Вашего вопроса.

alexrr
Забавнее что результат process_string() не зависит от flag. :-) И потому на выход отдаются все строки, а не только с заменами.
А уж про утечки памяти вообще молчу-молчу.

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 19:01 
Заслуженный участник


09/05/12
25179
Dmitriy40 в сообщении #1318482 писал(а):
Ну по идее должно, ведь прочие символы останутся как есть.
Увы, в реальности этого не происходит (собственно, ТС это уже сообщил).
Dmitriy40 в сообщении #1318482 писал(а):
А уж про утечки памяти вообще молчу-молчу.
Это ладно, тут бы написать программу, выполняющую то, что нужно...

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 20:05 
Заслуженный участник


20/08/14
11778
Россия, Москва
Pphantom в сообщении #1318487 писал(а):
тут бы написать программу, выполняющую то, что нужно...
Согласен.

А никто не обратил внимания что образцовый вывод не совпадает с заданием? По заданию счётчик надо писать в конце строки, а не всего файла. И (вероятно) обнулять в начале каждой строки.

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение10.06.2018, 13:47 


16/12/17
27
Изменил, теперь выдает почти то, что нужно. Но не могу понять, как убрать те строки, в которых не было таких преобразований.
Используется синтаксис C
while((fgets(mass, 100, f)) != NULL)
    {
                mass = process_string(mass, user_sym, &count);
        fprintf(g, "%s", mass);
        fseek(g, -1, SEEK_CUR);
        fprintf(g, " %d", count);
        fprintf(g, "%c", '\n');
        count=0;  
     }
     fclose(g);
     fclose(f);
}

 

Новый вывод
Используется синтаксис C
a HELLO I HOUSE 10
rrrr ttt uu 0
HHH III 6


-- 10.06.2018, 14:49 --

Dmitriy40 в сообщении #1318498 писал(а):
Pphantom в сообщении #1318487 писал(а):
тут бы написать программу, выполняющую то, что нужно...
Согласен.

А никто не обратил внимания что образцовый вывод не совпадает с заданием? По заданию счётчик надо писать в конце строки, а не всего файла. И (вероятно) обнулять в начале каждой строки.

Да, все-таки надо после каждой строки, в который приведены преобразования, записать их количество.

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение10.06.2018, 14:38 
Заслуженный участник


09/05/12
25179
alexrr в сообщении #1318660 писал(а):
Но не могу понять, как убрать те строки, в которых не было таких преобразований.
Очевидно, проверять перед выводом значение count.

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение10.06.2018, 14:50 


16/06/10
199
Код:
fgets()
читает строку вместе с символом «новая строка» в конце(если он есть). Этот символ, наверное, выводить не надо. Может не надо делать копию исходной строки, она ведь больше не нужна. Для лучшей переносимости и читаемости используйте стандартные функции
Код:
strchr(), islower(), toupper()
.

 Профиль  
                  
 
 Re: Работа с файлами. С
Сообщение10.06.2018, 16:06 
Заслуженный участник


20/08/14
11778
Россия, Москва
alexrr в сообщении #1318660 писал(а):
Используется синтаксис C
fprintf(g, "%s", mass);
fseek(g, -1, SEEK_CUR);
fprintf(g, " %d", count);
fprintf(g, "%c", '\n');
А вот так сделать религия не позволяет что ли?
Используется синтаксис C
fprintf(g, "%s %d\n", mass, count);

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group