Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа для печати файлов по страницам 
:(
    Опции темы
DarthGuyver
Дата 3.11.2009, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 3.11.2009

Репутация: нет
Всего: нет



Здравствуйте!!
У меня во какая проблема!!
Вот задание :
Напишите программу, печатающую несколько файлов. Каждый файл должен начинаться с новой страницы, предваряться заголовком и иметь свою нумерацию страниц.

Вот что я написал:


Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAXLINE 1000
 
struct fbook
{
    char *fpage;
    struct fbook *next;
};
 
struct fbook *getbook (struct fbook *, char *, int, unsigned int lines_in_page, FILE *);
 
int main (int argc, char *argv[])
{
    FILE *pF;
    struct fbook *books[argc - 1];
    char line[MAXLINE];
    unsigned int file_count, page;
 
    if (argc < 2)
    {
        fprintf (stderr, "ERROR: No files are chosen!\n");
        exit (1);
    }
    file_count = 1;
    while (file_count < argc)
    {
        if ((pF = fopen (argv[file_count], "r")) == NULL)
        {
            fprintf (stderr, "ERROR: Can't open file %s\n", argv[file_count]);
            exit (1);
        }
        if ((books[file_count - 1] = getbook (books[file_count - 1], line, MAXLINE, 15, pF)) == NULL)
        {
            fprintf (stderr, "ERROR: Can't get a book!!!\n");
            exit (1);
        }
        if (fclose (pF) == EOF)
            fprintf (stderr, "ERROR: Can't close the file: %s\n", argv[file_count]);
        file_count++;
    }
    file_count--;
    while (file_count > 0)
    {
        for (page = 1; books[file_count - 1] != NULL; books[file_count - 1] = books[file_count - 1]->next)
        {
            printf ("%s------------------------------------------------------------\n", argv[file_count]);
            printf ("%s", books[file_count - 1]->fpage);
            printf ("------------------------------------------------------------%d\n", page);
        }
        file_count--;
    }
    return 0;
}
 
struct fbook *getbook (struct fbook *pBook, char *line, int maxline, unsigned int lines_in_page, FILE *pFile)
{
    unsigned int line_number;
    char *prev_line, *stat;
 
 
    if ((pBook = (struct fbook *) malloc (sizeof (struct fbook))) == NULL)
    {
        fprintf (stderr, "ERROR: Not enough memory\n");
        return NULL;
    }
    line_number = 1;
    while (line_number <= lines_in_page)
    {
        if (fgets (line, maxline, pFile) == NULL)
            break;
        free (pBook->fpage);
        if (line_number == 1)
        {
            pBook -> fpage = (char *) malloc (strlen (line) + 1);
            strcpy (pBook -> fpage, line);
        }
        else
        {
            pBook -> fpage = (char *) malloc (strlen (prev_line) + strlen (line) + 2);
            strcpy (pBook ->fpage, prev_line);
            strcat (pBook -> fpage, line);
        }
        free (prev_line);
        prev_line = (char *) malloc (strlen (pBook -> fpage) + 1);
        strcpy (prev_line, pBook -> fpage);
        line_number++;
    }
    if (line_number > lines_in_page)
        pBook->next = getbook (pBook->next, line, maxline, lines_in_page, pFile);
    else
        (pBook->next = NULL);
    return pBook;
}


Винда выводит ошибку, что какая-то там инструкция, которая обращается к какому-то там месту в памяти не может быть прочитана!!!
Пожалуйста объяcните где прокол в коде?

Ещё штука, которая мне мозг разрывает, еси в функ

struct fbook *getbook (struct fbook *pBook, char *line, int maxline, unsigned int lines_in_page, FILE *pFile)

написать printf("бла бла бла"); , то она печатает первую страницу и всё и завершает работу без ошибок!!!

Я конечно прогу зделал другим способом. но хочется просто понять в чём тут ошибка, дабы впредь их не делать!!!
PM MAIL   Вверх
jonie
Дата 3.11.2009, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

Код

    if ((pBook = (struct fbook *) malloc (sizeof (struct fbook))) == NULL)
    {
        fprintf (stderr, "ERROR: Not enough memory\n");
        return NULL;
    }
    line_number = 1;
    while (line_number <= lines_in_page)
    {
        if (fgets (line, maxline, pFile) == NULL)
            break;
        free (pBook->fpage);

в первой строке выделяете память под структуру, содержащую указатель char* (с именем fpage).
В последней очищаете память по указателю, а вы ее не выделяли к моменту free (выделяете ниже по коду).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
DarthGuyver
Дата 3.11.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 3.11.2009

Репутация: нет
Всего: нет



Я думал если NULL то free ничего не делает!!!
Но хорошо попробую в условие запихнуть!!
Спасибо за подсказку
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0776 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.