Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Правильное использование fopen и fgets/fgetc

03.07.2014, 15:38. Показов 1895. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла проблема, раньше я использовал конструкцию для чтения файла в текстовом режиме с чтением в буффер фиксированной длины (1025), оказалось что если длина строки в файле больше 1024, то моя функция не правильно срабатывает, т.к. последующие символы не читаются, а сразу переносится на следующую строку.
C++
1
2
3
4
5
6
7
8
9
if( (fr = fopen(filename, "r")) == NULL)
        return -1;
    else
    {
        while(!feof(fr))
        {
            fgets(textbuf, sizeof(textbuf), fr);
            dl = strlen(textbuf);
...
после выявления ошибки пришлось протестировать файл, заменив fgets на:
C++
1
2
3
4
5
int cs = 0, np = 0;//при объявлении в глобальных
 
cs = fgetc(fr);
            if(cs == '\n')
                np++;
При чём в файле, который я открываю блокнотом всего 245 строк (т.е. я нажимаю на вкладку перейти, а курсор на последней строке). Однако последняя конструкция мне указывает что найдено 363 символа '\n' (т.е. кол-во строк 363).. Чего я не понимаю, как вообще такое возможно...

Вот и теперь возник вопрос как правильно использовать fgets с учётом того что мне надо до конца строки заполнить textbuf. (лучше бы примерчик)
Ну и конешно вопрос с ошибкой теста.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2014, 15:38
Ответы с готовыми решениями:

Fopen и fgets, не понимаю как с ними оперировать
Получаю такую штуку как sentence из командной строки в виде C:\folder\name.txt, и хочу её вставить в fopen. Обычно пишут...

Использование функции fgets
Передо мной встала следующая проблема - не могу понять, как работает функция strcmp. К примеру приведу данный код программы: ...

Использование оператора fgets
Помогите решить задачу, пожалуйста, с использованием функции fgets. В командной строке программе передаются два числа. Из файла с текстом...

2
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
06.07.2014, 13:27
Лучший ответ Сообщение было отмечено Izual как решение

Решение

Много есть способов, но я бы сделал как-то так:

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
#include <stdbool.h>
#include <stdio.h>
 
typedef struct string {
    char* buf;
    size_t len;
    size_t siz;
} *String;
 
String String_Clear(String str)
{
    str->len = 0;
    str->buf[0] = '\0';
    return str;
}
 
String String_New(size_t init_size)
{
    String str = (String) malloc(sizeof(*String));
    str->siz = init_size;
    str->buf = (char*) malloc(str->buf, str->siz);
    return String_Clear(str);
}
 
void String_AddChar(String str, char c)
{
    str->buf[str->len] = c;
    str->len += 1;
    if( str->len == str->siz ) {
        str->siz *= 2;
        str->buf = (char*) realloc(str->buf, str->siz);
    }
    str->buf[str->len] = '\0';
}
 
bool String_Read(String str, FILE* f)
{
    String_Clear(str);
    int c;
    while( (c = fgetc(f)) != '\n' ) {
        if( c == EOF ) { return false; }
        if( c ) {
            String_AddChar(str, c);
        }
    }
    return true;
}
 
void String_Reverse(String str)
{
    char t;
    size_t r = str->len;
    size_t len2 = str->len / 2;
    for( size_t i = 0; i < len2; ++i ) {
        t = str->buf[i];
        str->buf[i] = str->buf[--r];
        str->buf[r] = t;
    }
}
 
void String_Put(String str, FILE* f)
{
    fputs(str->buf, f);
    fputc('\n', f);
}
 
void String_Delete(String str)
{
    free(str->buf);
    free(str);
}
 
int main(void)
{
    FILE* input = stdin;
    FILE* output = stdout;
 
    String str = String_New(1024);
 
    while( String_Read(str, input) ) {
        String_Reverse(str);
        String_Put(str, output);
    }
 
    String_Delete(str);
 
    return 0;
}
2
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
06.07.2014, 15:54  [ТС]
Vtulhu, спасибо конешно, но string не использую, не нравится мне вид string'ov
Оказалось что проблема была в символах '\n' и '\0', из за них не правильно срабатывал алгоритм.
А конструкция while(!feof(fr)) с заданой длиной буфера для чтения будет работать либо до /n либо до /0..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2014, 15:54
Помогаю со студенческими работами здесь

Использование функции fgets, где ошибка?
Все привет. В чем может быть ошибка, уже долго сижу и не понимаю. Я сперва со строки беру значение и заношу в файл, затем я хочу вытянуть...

Как предотврати вывод ошибки при использование fopen
Здравствуйте, пытаюсь открыть файл fopen( $path, 'w' ) or die( &quot;Error: Can't open file&quot; ); но если он не доступен я получаю -...

Warning: fopen(t3.txt) [function.fopen]: failed to open stream:
Привет, у меня возникли такиe проблемы: 1.веду поиск в папке Texte. Папка находится в папке Scripte php4. $dir =...

fopen не читает из URL - Warning: fopen('http://www....','r') - Bad file descriptor in .....gethtml.php on line 16
Как известно с помощью fopen можно прочитать данные не только из файла но и из URL. Проблема в том что обращаясь через прокси я получаю...

Правильное использование EntityFramework
Всем привет. Замучал меня теоретический вопрос: Вот представим что есть некая сущность. И есть у нее поля. Мне необходимо проверять...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru