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

С++ для начинающих

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

В текстовый файл вставить пробелы, что бы количество символов равнялось 80, взяв строки из другого файла - C++

22.01.2014, 17:58. Просмотров 396. Ответов 4
Метки нет (Все метки)

Доброго времени суток!
Очень нужна помощь в немного странной задаче.
В текстовый файл нужно вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов. Причем надо строки брать из первого файла и уже во втором добавлять пробелы, чтобы длина каждой строки была 80.
Логически понимаю, что надо в цикл запихнуть, кол-во символов в строчке считать и проверить ее размер, если он меньше - дозаполнить до значения, равного 80. Но как это все записать - знаний не хватает нет, а времени мало.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2014, 17:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В текстовый файл вставить пробелы, что бы количество символов равнялось 80, взяв строки из другого файла (C++):

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов - C++
Доброго времени суток! Прошу помочь мне с одной программкой...ибо она меня уже замучила:) "В текстовый файл вставить пробелы таким...

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов - C++
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов (пробелы в строке должны быть вставлены...

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов - C++
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов (пробелы в строке должны быть вставлены...

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов - C++
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов (пробелы в строке должны быть вставлены...

Организовать текстовый файл, состоящий из N строк. Определить среднее количество символов в строке данного файла - C++
Ребятки помогите пожалуйста Добавлено через 1 час 14 минут и ещё одну Дана квадратная матрица порядка N. Вычислить среднее...

Дано целое число K и текстовый файл. Вставить пустую строку перед строкой файла с номером K. Если строки с так - C++
Помогите составит программу на c++ .Дано целое число K и текстовый файл. Вставить пустую строку перед строкой файла с номером K. Если...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nikolay1982
93 / 93 / 38
Регистрация: 22.01.2014
Сообщений: 316
23.01.2014, 01:29 #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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
 
//#include "fio_utl.c"
//#include "str_code.c"
 
 
int is_word_char(char c)
{
    int ci;
    unsigned char cu;
    cu=(unsigned char)c;
    if ((cu>=65)&&(cu<=90)) return 1;
    if ((cu>=97)&&(cu<=122)) return 1;
    if ((cu>=192)&&(cu<=255)) return 1;
    if ((cu>=140)&&(cu<=144)) return 1;//Rom
    switch(cu) //Roms chars
    {
    case 128:
    case 129:
    case 131:
    case 138:
    case 154:
 
    case 168://e-
    case 184:
        return 1;
 
 
 
    }
    return 0;
 
 
}
char endL[]="\r\n";
char out_str[256];
void print_out(char *buf,int startIx,int count){
    memset(out_str,0,sizeof(out_str));
    memcpy(out_str,&buf[startIx],count);
    printf("\n%s",out_str);
}
void format_80(char *fname)
{
    char buf[260];
    char tmpi[10];
    char c;
    char *tmp,*tmp2;
    int i,j,firstWordIx,le,readed;
    int fsz,is_word,lastI,co;
    FILE *fi,*fo;
    fsz=file_size_fn(fname);
    fi=fopen(fname,"rb");
    if (fi==NULL)
    {
        printf("\n Err can not acces file:%s",fname);
        return;
    }
    tmp=(char*)malloc(fsz);
 
    i=0;
    readed=fread(tmp,1,fsz,fi);
    fclose(fi);
    if (readed<=0)
    {
 
        free(tmp);
        return;
    }
    sprintf(tmpi,"_80.txt");
    strcpy(buf,fname);
    strcat(buf,tmpi);
    fo=fopen(buf,"wb");
    if (fo==NULL)
    {
        printf("\n Err can not acces file:%s",buf);;
        free(tmp);
        return;
    }
    tmp2=(char*)malloc(81);
    for (i=0; i<80; i++) tmp2[i]=' ';
    j=-1;//tek kol-vo simvolov
    firstWordIx=-1;//index pervogo char v slove
    lastI=0;//Poslednii simvol (kotorii ne zapisan)
    for (i=0; i<fsz; i++)
    {
        j++;
        c=tmp[i];
        is_word=is_word_char(c);
        if (is_word)
        {
            if (firstWordIx<0)
            {
                firstWordIx=i;//
 
            }
            else
            {
 
            }
        }
        else firstWordIx=-1;
        if ((c==10)&&(j<80))
        {
            fwrite(&tmp[lastI],1,1+i-lastI,fo);
            lastI=i+1;
            j=0;
            firstWordIx=-1;
            continue;
        }
        if (j>=80)
        {
            if (!is_word)
            {
                co=i-lastI;
                //printf("\nObicinii lastI:%i wt:%i",lastI,co);
                fwrite(&tmp[lastI],1,co,fo);
                fwrite(endL,1,2,fo);
            }
            else
            {
                if (firstWordIx>=0)
                {
                    co=firstWordIx-lastI;
                    fwrite(&tmp[lastI],1,co,fo);
                    //printf("\nlastI:%i wt:%i",lastI,co);
                    //print_out(tmp,lastI,firstWordIx-lastI);
                    co=80-(firstWordIx-lastI);
                    fwrite(tmp2,1,co,fo);
                    fwrite(endL,1,2,fo);
                    co=i-firstWordIx+1;
                    fwrite(&tmp[firstWordIx],1,co,fo);
                    //printf("\nfirstWordIx:%i wt:%i",firstWordIx,co);
                    //print_out(tmp,firstWordIx,co);
                    j=1+i-firstWordIx;
                    lastI=i+1;
                    firstWordIx=-1;
                    continue;
                }
            }
            lastI=i+1;
            j=0;
            firstWordIx=-1;
        }
 
 
    }
 
    fclose(fo);
 
    free(tmp);
    free(tmp2);
}
static void usage()
{
    printf("format_80 infile.txt\n");
 
}
int main(int argc,char **argv)
{
    char *fn;
    char fout[260];
    char tmpi[20];
    int size,le;
 
    if (argc==2)
    {
        format_80(argv[1]);
        //printf("\nComplete!");
    }
    usage();
    return 0;
}
0
AmidaWolf
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 4
23.01.2014, 01:47  [ТС] #3
Цитата Сообщение от nikolay1982 Посмотреть сообщение
Попробуйте подправить этот код.
Будте внимательны, здесь есть ошибка.
Прследнюю строку, кажется не коректно выводит.
Спасибо за предложенный вариант. К сожалению я только начинаю разбираться в кодинге и потому мне не совсем понятны действия в строках с 9 по 33. Да и вообще тяжеловато воспринимается (те же функиции и переменные, зачем они и т.д.) как-то с отсутствием комментариев. Если Вам не сложно, я буду весьма признателен за пояснения (комменты) в коде.
Еще раз благодарю за помощь.
Рассмотрю еще варианты решения.
0
nikolay1982
93 / 93 / 38
Регистрация: 22.01.2014
Сообщений: 316
23.01.2014, 02:16 #4
Функция is_word_char возвращает если char является символом. 'A'-'Z' это 65-90 ; 'a'-'z' - 97-122.
switch в указанной функции можете удалить - это для румынских символов. Эта функция нужна, для того чтобы не разовать половину слова если его содержимое попадет на 80 байт. Может вам не требуется в вашем ТЗ.

Добавлено через 1 минуту
C++
1
2
if ((cu>=192)&&(cu<=255)) return 1;
    if ((cu>=140)&&(cu<=144)) return 1;
Это для кодировки 1251 русские буквы
0
AmidaWolf
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 4
23.01.2014, 02:47  [ТС] #5
Цитата Сообщение от nikolay1982 Посмотреть сообщение
Функция is_word_char возвращает если char является символом. 'A'-'Z' это 65-90 ; 'a'-'z' - 97-122.
switch в указанной функции можете удалить - это для румынских символов. Эта функция нужна, для того чтобы не разовать половину слова если его содержимое попадет на 80 байт. Может вам не требуется в вашем ТЗ.

Добавлено через 1 минуту
C++
1
2
if ((cu>=192)&&(cu<=255)) return 1;
    if ((cu>=140)&&(cu<=144)) return 1;
Это для кодировки 1251 русские буквы
Да, Вы правы, разрыв слова абсолютно не важен. 80 символов - новая строка в любом случае.
Остальное лучше на свежую голову утром гляну, сейчас уже мозг отказывается воспринимать информацию.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2014, 02:47
Привет! Вот еще темы с ответами:

Файл: Переписать один текстовый файл в другой при условии, что все двойные пробелы буду заменены одинарными - C++
Здравствуйте, помогите, пожалуйста, с заданием, а то все мои идеи нерабочие совсем. Задание: Переписать один текстовій файл в другой при...

В файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов - C++
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов (пробелы в строке должны быть вставлены...

Переименовать файл, взяв имя из другого файла - CMD/BAT
Всем привет, прошу прощения за глупый, возможно вопрос. Стоит задача переименовывать файл в автоматическом режиме, причем имя файла брать у...

Дано целое число K и текстовый файл. Вставить пустую строку после строки файла с номером K. - Turbo Pascal
Text10. Дано целое число K и текстовый файл. Вставить пустую строку после строки файла с номером K. Если строки с таким номером нет, то...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.01.2014, 02:47
Ответ Создать тему
Опции темы

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