Форум программистов, компьютерный форум CyberForum.ru

Работа с файлами. Редактирование файла - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.66
Skai
Сообщений: n/a
02.12.2008, 17:11     Работа с файлами. Редактирование файла #1
Задачка такая... переписать содержимое файла А в файл Б, удалив однобуквенные слова и пробелы..
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <locale>
int main() {
 
    setlocale (LC_ALL, ".1251");
    FILE *f;
    f = fopen( "read.txt", "r");
    if (f==NULL) {
        printf("File "read.txt" not found.\n");
        return -1;
    }
    FILE *g;
    g = fopen( "write.txt", "w");
    if (g==NULL) {
        printf("File "write.txt" could not be created.\n");
        return -1;
    }
    while( true ) {
        int c = fgetc(f);
        if (feof(f)!=0) break;
        printf("%c", c);
        fputc(c, g);
    }
 
    fclose(f);
    fclose(g);
    printf("\n");
    printf("Готово! Смотри что получилос в файле "test_out.txt".\n");
    _getch();
}
переписать я переписал.. но вот как убрать слова с длиной в один символ и пробелы..? Помогите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2008, 17:11     Работа с файлами. Редактирование файла
Посмотрите здесь:

C++ Работа с файлами. Чтение из файла.Поиск.
Работа с файлами - взять 5-ый символ файла C++
Работа с файлами. Вывести бинарный код файла на экран в Visual C++ C++
C++ Работа с файлами (код, выводящий из файла все теги)
C++ Работа с файлами. Из имеющего файла по сортировать в отдельные файлы
Работа с файлами. Считывание информации из файла в массив C++
C++ Работа с файлами (вместо рендомного ввода массива ввести с файла)
C++ Работа с текстовыми файлами: Вывод из текстового файла
Работа с файлами, название файла задается в командной строке C++
Работа с файлами, запись строки в файл и чтение из файла C++
C++ Работа с файлами в двоичном режиме. Запись одного файла в другой
Работа с файлами, необычный вывод из файла C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
=TrappeR=
3 / 3 / 1
Регистрация: 02.12.2008
Сообщений: 11
02.12.2008, 19:29     Работа с файлами. Редактирование файла #2
Программу отладил в C++Builder:
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <locale>
int main()
{
    setlocale (LC_ALL, ".1251");
    FILE *f;
    f = fopen( "read.txt", "r");
    if (f==NULL) {
        printf("File "read.txt" not found.\n");
        return -1;
    }
    FILE *g;
    g = fopen( "write.txt", "w");
    if (g==NULL) {
        printf("File "write.txt" could not be created.\n");
        return -1;
    }
 
    char c, buf[100] = "";
    int i = 0;
    do {
        /* цикл сохранения во временную переменную всех символов
           кроме пробела и одиночных символов */
        c = fgetc(f);
        if (c != ' ' && c != EOF)
            buf[i++] = c;
        else {
            if (i > 1) {
                fputs(buf, g);
                printf("%s", buf);
            }
            i = 0;
        }
        buf[i] = '\0';
    } while (c != EOF);
 
    fclose(f);
    fclose(g);
    printf("\nГотово! Смотри что получилос в файле "test_out.txt".\n");
    getch();
}
Добавлено через 21 минуту 46 секунд
Держи отлаженный исходник:
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <locale>
int main()
{
    setlocale (LC_ALL, ".1251");
    FILE *f;
    f = fopen( "read.txt", "r");
    if (f==NULL) {
        printf("File "read.txt" not found.\n");
        return -1;
    }
    FILE *g;
    g = fopen( "write.txt", "w");
    if (g==NULL) {
        printf("File "write.txt" could not be created.\n");
        return -1;
    }
 
    char c, buf[100] = "";
    int i = 0;
    do {
        /* цикл сохранения во временную переменную всех символов
           кроме пробела и одиночных символов */
        c = fgetc(f);
        if (c != ' ' && c != EOF)
            buf[i++] = c;
        else {
            if (i > 1) {
                fputs(buf, g);
                printf("%s", buf);
            }
            i = 0;
        }
        buf[i] = '\0';
    } while (c != EOF);
 
    fclose(f);
    fclose(g);
    printf("\nГотово! Смотри что получилос в файле "test_out.txt".\n");
    getch();
}
P.S. и не объявляй переменную в цикле:
C++
1
2
3
while( true ) {
    int c = fgetc(f);
    -//-//-
Добавлено через 25 минут 10 секунд
Дополненная программа с использованием командной строки:
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
#include <stdio.h>
#include <conio.h>
int main(int argc, char *argv[ ])
{
    FILE *fin;
    FILE *fout;
    if (argc != 3) {  /* Проверка командной строки */
        printf("\n Формат вызова программы:");
        printf("\n copyfile.exe");
        printf("\n файл-источник файл-приемник");
    }
    if ((fin = fopen(argv[1], "r")) == NULL) {
        perror(argv[1]);
        return 1;
    }
    if ((fout = fopen(argv[2], "w")) == NULL) {
        perror(argv[2]);
        return 1;
    }
 
    char ch, buf[100] = "";
    int i = 0;
    do {  /* цикл сохранения во временную переменную всех символов
             кроме пробела и одиночных символов */
        ch = fgetc(fin);
        if (ch != ' ' && ch != EOF)
            buf[i++] = ch;
        else {
            if (i > 1) {
                fputs(buf, fout);
                printf("%s", buf);
            }
            i = 0;
        }
        buf[i] = '\0';
    } while (ch != EOF);
 
    fclose(fin);
    fclose(fout);
    getch( );
    return 0;
}
...что не понятно спрашивай.
Skai
Сообщений: n/a
04.12.2008, 16:59     Работа с файлами. Редактирование файла #3
Спасибо большое!! Разобрался.
но вот появилась ещё проблемка..
Суть задачи в следующем:

Дан файл, содержащий : фамилия число месяц и год рождения. Найти всех у кого будет день рождения в данном месяцу года и указать их возраст. Реализовать на двоич файлах.
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
106
107
108
109
110
111
112
113
114
115
116
117
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#pragma pack(1)
struct block{
    char name[21];
    char god[5];
    char mes[10];
    char day[3];
};
#pragma pack(1)
FILE *f;
char ss[21];
void open(void);
void menu(void);
void add(void);
void view(void);
void f3(void);
int main(){
    setlocale(LC_ALL,"Russian");
    printf ("Задание 66_6. Дан файл F, содержащий номера телефонов сотрудников учреждения:\nфамилия сотрудника, его инициалы и номер телефона.\n"
            "Найти телефон сотрудника по фамилии и инициалам.\n");
    printf ("------------------------------\n");
    open();
    menu();
    while(true){
        printf("\rВыберите пункт меню: ");
        char c;
        c=_getche();
        switch(c){
            case '1': add(); menu(); break;
            case '2': view(); menu(); break;
            case '3': f3(); menu(); break;
            case '4': fclose(f); exit(0);
        }
    }
}
//=============================================
void menu(void){
    printf("\n1. Добавление записи\n"
    "2. Просмотр базы\n"
    "3. Поиск сотрудников по дате рождения\n"
    "4. Выход\n\n");
}
void open(void){
    f=fopen("people.dat","rb+");
    if (f==NULL){
        printf("Не могу открыть "people.dat".\n");
        _getch();
        exit(-1);
    }
}
void add(void){
    int n;
    printf("\n\nДобавление\nВыход - 0\n\n");
    block a;
    while(true){
        printf("Фамилия : ");
        n = scanf_s("%20[^\n]s", a.name, 21);
        fflush(stdin);
        if (n!=1) a.name[0]='\0';
        if(a.name[0]=='0'||a.name[0]==0) break;
 
        printf("Год рождения : ");
        n = scanf_s("%11[^\n]s", a.god, 5);
        fflush(stdin);
        if (n!=1) a.god[0]='\0';
        if(a.god[0]=='0'||a.god[0]==0) break;
 
        printf("Месяц : ");
        n = scanf_s("%20[^\n]s", a.mes, 10);
        fflush(stdin);
        if (n!=1) a.mes[0]='\0';
        if(a.mes[0]=='0'||a.mes[0]==0) break;
 
        printf("День : ");
        n = scanf_s("%20[^\n]s", a.day, 3);
        fflush(stdin);
        if (n!=1) a.day[0]='\0';
        if(a.day[0]=='0'||a.day[0]==0) break;
 
        fwrite(&a,sizeof(block),1,f);
    }
}
void view(void){
    fseek(f,0,SEEK_SET);
    printf("\n\nПросмотр базы...\n\n\tИмя: \t\tГод: Месяц:   День:\n");
    setlocale (LC_ALL,".866");
    block a;
    while(true){
        if(fread(&a,sizeof(block),1,f)<1) break;
        printf("\t%s\t%s %s %s\n",a.name,a.god,a.mes,a.day);
    }
    setlocale (LC_ALL,".1251");
}
void f3(void){
    int n;
    int result;
    int cmpr;
    result=0;
    printf("\n\nВведите дату рождения сотрудника(в формате: год месяц):\n");
    n = scanf_s("%20[^\n]s", ss, 21);
    fflush(stdin);
    if (n!=1) ss[0]='\0';
    fseek(f,0,SEEK_SET);
    printf("\n\nПоиск...\n");
    block a;
    while(true){
        /*Вот как тут реализовать поиск? */
        }
    }
    setlocale (LC_ALL,".1251");
    if (result==0) printf("\nПо Вашему запросу ничего не найдено.\n");
}
Заранее надеюсь и благодарю за помощь!
xotabs
 Аватар для xotabs
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 26
09.12.2008, 19:53     Работа с файлами. Редактирование файла #4
Спасибо. С вводом имени файла разобрался. Теперь мне необходимо создать из файла двумерный массив. Вот набор чисел:
Код
-23 -33  -1  16  10  -8   4 -20 -18 -26  10  -5 -28 -37  34  -2  49  21   2 -47;   -2   19  -41  -30  -22  -38   42   35   38    6,   39   43  -25  -33   34   46  -19   50   47   22,  -22   -6  -33    0   22  -34  -34   52   35   48,  -22  -20    2   -6    0  -21    9   55  -36   15,  -30   12  -30   -6  -36  -13   -6  -15    0   11,   35  -38  -41  -30   43   39   14  -16   17  -34,  -10  -20  -31  -18  -10    4  -15   12    5  -32,    0  -33  -28   47  -13  -23  -25   46  -31   29,  -25    5   11   40   29   11  -36   33   52   47,  -29   48  -15   48  -17   47   26   10   18   38,
Всё что находится после ";" это элементы двумерного массива. Строки двумерного массива разделены ",". Может кто знает, как можно записать эти числа в двумерный массив?
Yandex
Объявления
09.12.2008, 19:53     Работа с файлами. Редактирование файла
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru