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

Чтение всего файла, а не только до первого переноса

27.06.2016, 17:47. Просмотров 810. Ответов 6
Метки нет (Все метки)

Недавно научился делать простые сайты, и уже принялся учить других как это делать. Решил автоматизировать процесс и сделать программу которая заменяет символы типа "<" на "&lt" для вывода кода на странице. Изучаю чтение файлов на СИ. Задача легкая но трудность - функция читает файл только до первого переноса, остальное содержимое игноррирует. Как мне прочитать весь файл а не только до первого переноса строки? вот код на даный момент:
C++
1
2
3
4
5
6
7
8
9
10
11
FILE *file;
    char* file_name = "html_code.txt";
    char load_string[500];
    file = fopen( file_name, "r" );
    if( file != 0 )
    {
    fgets( load_string, 500 , file );
    for(int i=0; i<200; i++)
    printf("%c",load_string[i]);
    }
    fclose( file );
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2016, 17:47
Ответы с готовыми решениями:

Чтение всего файла в одну динамическую строку
Здравствуйте! Искал на форуме ответ на свой вопрос, нашел кучу похожих тем,...

Чтение всего файла в одну динамическую строку
Здравствуйте! Искал на форуме ответ на свой вопрос, нашел кучу похожих тем,...

Чтение первого значения в строках(до первого пробела) из текстового файла в массив
Здравствуйте, нужно читать из файла в масив первое значение строки(до пробела)...

Чтение всего файла fstream
В общем мне казалась задача вполне очевидна и частая считать файл целиком в...

Чтение всего файла методом FileRead
Здравствуйте! Имеется файл в котором записаны строки, нужно их все вытащить: ...

6
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
27.06.2016, 18:09 2
Лучший ответ Сообщение было отмечено PeterBr как решение

Решение

функцию fgets используйте в цикле,например
C
1
2
3
while(fgets( load_string, 500 , file )){
        //какие-то действия со строкой
}
0
Геомеханик
798 / 602 / 939
Регистрация: 26.06.2015
Сообщений: 1,409
28.06.2016, 02:56 3
PeterBr, вот накидал свой вариант.
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
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
typedef struct {
    char*  buf;
    size_t pos;
    size_t len;
} osstream_t;
 
const char* osstream_str(osstream_t* os);
void  osstream_init(osstream_t* os);
int   osstream_write(osstream_t* os, const char* s, size_t n);
void  osstream_free(osstream_t* os);
int   html_spchars(const char* filename);
 
int main(void){ 
    char fn[256] = "cpp.htm";
    if(html_spchars(fn))
        puts("ok, htmlspecialchars.");
    else
        puts("error!");
    getchar();
    return 0;
}
 
//преобразование спец-символов в html
int html_spchars(const char* filename){
    int i, r, n;
    osstream_t os;
    char  s[256], *p, c;
    FILE* fp = fopen(filename, "r+");
    if(fp == NULL)
        return 0;
 
    const char cs[] = { '<', '>', '&', '"', '\n', '\t', ' ' };
 
    const char* htmls[] = {
        {"&lt;"}, {"&gt;"}, {"&amp;"}, {"&quot;"}, {"<br />\n"}, {"&nbsp; &nbsp; "}, {"&nbsp;"}
    };
 
    r = 1;
    n = 7;
    c = '\0';
    osstream_init(&os);
    while(((p = fgets(s, 256, fp)) != NULL) && !ferror(fp)){
        while(*p){
 
            for(i = 0; i < n; ++i){
                if(*p == cs[i])
                    break;
            }
 
            if(i == n)
                r = osstream_write(&os, p, 1);
            else {
                if((*p == ' ') && (*p != c))
                    r = osstream_write(&os, " ", 1);
                else
                    r = osstream_write(&os, htmls[i], strlen(htmls[i]));
            }
 
            if(! r)
                break;
 
            c = *p++;
        }
    }
 
    if(!r || ferror(fp) != 0){
        fclose(fp);
        osstream_free(&os);
        return 0;
    }
 
    rewind(fp);
    fputs( osstream_str(&os), fp);
    fflush(fp);
    fclose(fp);
    osstream_free(&os);
    return 1;
}
 
//инициализация
void osstream_init(osstream_t* os){
    os->buf = NULL;
    os->pos = 0;
    os->len = 256;
}
 
//получение строки
const char* osstream_str(osstream_t* os){
    if(os->buf != NULL)
        os->buf[os->pos] = '\0';
    return os->buf;
}
 
//запись в поток
int osstream_write(osstream_t* os, const char* s, size_t n){
    char* p;
    if(os->buf == NULL){
        os->buf = (char*)malloc(os->len * sizeof(char));
        if(os->buf == NULL)
            return 0;
    } else if((os->pos + n + 1) >= os->len){
        p = (char*)realloc(os->buf, (os->pos + n + os->len / 2) * sizeof(char));
        if(p == NULL)
            return 0;
        os->buf = p;
        os->len = os->pos + n + os->len / 2;
    }
 
    if(n == 1)
        os->buf[os->pos] = *s;
    else
        strncpy(os->buf + os->pos, s, n);
    os->pos += n;
    return 1;
}
 
//удаление
void osstream_free(osstream_t* os){
    if(os->buf != NULL)
        free(os->buf);
    osstream_init(os);
}
0
PeterBr
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 30
28.06.2016, 11:44  [ТС] 4
а что так мнгого то кода? у меня гораздо меньше, но вроде все работает.
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
void replace(char *arg){
int count=0;
char article_code[1000];
    for(int i=0; i<300; i++){
      if(arg[i]=='<')
        {article_code[count]='&';++count;
        article_code[count]='l';++count;
        article_code[count]='t'; ++count;}
        else if(arg[i]=='>')
        {article_code[count]='&';++count;
        article_code[count]='g'; ++count;
        article_code[count]='t'; ++count;}
        else if(arg[i]==' " '){article_code[count]=39; count++;}
        else {article_code[count]=arg[i]; ++count;}
    }
    for(int i=0; article_code[i]!='\n'; i++)
    {printf("%c",article_code[i]);
    }
printf("<br> \n");
}
 
 
int main()
 
{   int i=0;
    FILE *file;
    char* file_name = "html_code.txt";
    char load_string[300];
    file = fopen( file_name, "r" );
    printf("<div id='code'><br>");
    if( file != 0 )
    {
    while(fgets( load_string, 500 , file )){
             replace(load_string);
}
    }
    fclose( file );
printf("</div>");
    return 0;
}
0
Hikari
Хитрая блондиночка $)
1453 / 966 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.06.2016, 11:53 5
Цитата Сообщение от PeterBr Посмотреть сообщение
Изучаю чтение файлов на СИ.
А почему не на С++?
Дело пойдет гораздо быстрее.
0
PeterBr
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 30
28.06.2016, 12:10  [ТС] 6
Я работал с микроконтроллерами, поэтому неплохо знаком с обычным СИ. Но десктопные программы никогда не разрабатывал, и не знаю нюансы какой язык какие имеет возможности в этой сфере
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
28.06.2016, 17:14 7
Цитата Сообщение от PeterBr Посмотреть сообщение
Как мне прочитать весь файл а не только до первого переноса строки?
Цитата Сообщение от Hikari Посмотреть сообщение
А почему не на С++?
C
1
char * string_from_file ( char const *filename ) ;
читает все содержимое файла в одну строку.
да уж куда быстрее.

для сайтов лучше PHP
PHP
1
$text = file_get_content("file"); // можно URL ы читать
0
28.06.2016, 17:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2016, 17:14

Чтение всего текста из файла в string
Собственно вопрос. Как читать весь текст из файла в string Не в string а в...

Чтение и вывод всего содержимого файла на экран
Здравствуйте! Подскажите пожалуйста решение такой проблемы: В PascalABC.NET...

Чтение первого символа из файла
Короче, задача такая. Нужно считать первый символ в файле, если это решетка...


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

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

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