2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Работа с файлами. С
Сообщение09.06.2018, 17:13 
Здравствуйте! У меня никаких ошибок не выдает, но записывается в файл 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 
 i  Тема перемещена из форума «Помогите решить / разобраться (М)» в форум «Карантин»
Приведите тестовый пример: что обрабатывает программа, что должно получиться, что получается в действительности.

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

 
 
 
 Posted automatically
Сообщение09.06.2018, 17:39 
 i  Тема перемещена из форума «Карантин» в форум «Программирование»

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 17:48 
alexrr в сообщении #1318460 писал(а):
Используется синтаксис C
*(count)++;
Это выражение неправильно, тут не увеличение переменной по указателю, а увеличение самого указателя.

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

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 17:51 
Интересно, в описании задания и программе файлы названы по-разному, чтобы интереснее было? :facepalm:

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

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 17:52 
alexrr в сообщении #1318460 писал(а):
*(count)++;
Весьма изощрённое издевательство над читателем кода. (Неиздевательством было бы либо (*count)++, либо *(count++).)

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 18:04 
Pphantom в сообщении #1318474 писал(а):
Во-вторых, в каком конкретно месте обрабатывается ситуация, когда символ не является буквой?
Дык там изначально strcpy стоит ...

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 18:17 
Dmitriy40 в сообщении #1318478 писал(а):
Дык там изначально strcpy стоит ...
И как, помогает? :wink:

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 18:35 
Pphantom
Ну по идее должно, ведь прочие символы останутся как есть. Впрочем я код не запускал и не проверял.
Или не понял смысл Вашего вопроса.

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

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 19:01 
Dmitriy40 в сообщении #1318482 писал(а):
Ну по идее должно, ведь прочие символы останутся как есть.
Увы, в реальности этого не происходит (собственно, ТС это уже сообщил).
Dmitriy40 в сообщении #1318482 писал(а):
А уж про утечки памяти вообще молчу-молчу.
Это ладно, тут бы написать программу, выполняющую то, что нужно...

 
 
 
 Re: Работа с файлами. С
Сообщение09.06.2018, 20:05 
Pphantom в сообщении #1318487 писал(а):
тут бы написать программу, выполняющую то, что нужно...
Согласен.

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

 
 
 
 Re: Работа с файлами. С
Сообщение10.06.2018, 13:47 
Изменил, теперь выдает почти то, что нужно. Но не могу понять, как убрать те строки, в которых не было таких преобразований.
Используется синтаксис 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 
alexrr в сообщении #1318660 писал(а):
Но не могу понять, как убрать те строки, в которых не было таких преобразований.
Очевидно, проверять перед выводом значение count.

 
 
 
 Re: Работа с файлами. С
Сообщение10.06.2018, 14:50 
Код:
fgets()
читает строку вместе с символом «новая строка» в конце(если он есть). Этот символ, наверное, выводить не надо. Может не надо делать копию исходной строки, она ведь больше не нужна. Для лучшей переносимости и читаемости используйте стандартные функции
Код:
strchr(), islower(), toupper()
.

 
 
 
 Re: Работа с файлами. С
Сообщение10.06.2018, 16:06 
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  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group