Статьи Галерея Форум Чат Файлы HowTo Ссылки Поиск
Текущее время: 23 мар 2019, 12:24




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 23 ноя 2009, 23:16 
Заглянувший

У нас с: 11.10.2009
Сообщения: 4
Здравствуйте.
Мне необходимо посчитать количество символов в каждой строке входного файла и записать результат в выходной. Т.е., например, у нас есть текстовый файл вида

аааа
бб
ввв
ггг
ддддд

В выходном файле должна быть информация вида

Строка1 - 4 символа
Строка2 - 2 символа
Строка3 - 3 символа
Строка4 - 3 символа
Строка5 - 5 симолов

Всего - 5 строк 17 символов

В общем-то, саму программу я написал. Но вот как-то странно она работает. Когда запускаю её из под Windows, то всё Ок, а вот когда из под Linux, то для вышеуказанного примера выходной файл выглядит следующим образом

Строка1 - 4 символа
Строка2 - 2 символа
Строка3 - 3 символа
Строка4 - 3 символа
Строка5 - 5 симолов
Строка6 - 0 симолов

Всего - 5 строк 17 символов

Т.е., появляется лишняя запись о пустой 6-ой строке. Как это поправить?

Код ниже

Код:
#include <stdio.h>

#include <stdlib.h>




int main(int argc, char* argv[])

{

    FILE* in_file;

    FILE* out_file;

    int total_strings = 0;
    int total_symbols = 0;

    char* in_file_path; // path

    char* out_file_path;

    in_file_path = argv[1];
    out_file_path = argv[2];



    if (( in_file = fopen(in_file_path, "r")) == NULL)

    {

       printf("Failed to open an input file");

       exit(1);

    }

    if((out_file = fopen(out_file_path, "a")) == NULL)

    {

       printf("Failed to open an input file");

       exit(1);

    }



    else

    {

       char ch;

       int string_length = 0;

       int string_count = 0;



       do

       {

          ch = fgetc(in_file);

       

         if(ch != EOF)

         {



            if(ch == '\n' || ch == '\r') // if this is end of the line

            {

                  ++string_count;



                  fprintf(out_file, "%d",string_count);
                  fprintf(out_file, ". ");

                  fprintf(out_file, " %d ", string_length);

                  fprintf(out_file, "\n");


                  total_symbols += string_length;
                  ++total_strings;
                 

                  string_length = 0;

            }

            else

            {

                 string_length++;

            }



         }

         else // if file has ended - exit from program

         {

         ++string_count;



            fprintf(out_file, "%d",string_count);
            fprintf(out_file, ". ");

            fprintf(out_file, " %d ", string_length);

            fprintf(out_file, "\n");



            fprintf(out_file, "Total strings %d ",total_strings, ". ");

            fprintf(out_file, " Total symbols %d ", total_symbols);

            fprintf(out_file, "\n");
     

            string_length = 0;


            ch = fgetc(in_file);
            ch = fgetc(in_file);



             break;

         }

       

       } while(ch != EOF);

       return;

    }

}


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
СообщениеДобавлено: 23 ноя 2009, 23:29 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 13.09.2006
Сообщения: 849
Откуда: Минск
Код:
if(ch == '\n' || ch == '\r') // if this is end of the line


Я вот не очень понял, почему она у тебя в виндах работала, если там каждая последовательность "\r\n" должна была при таком подходе трактоваться как два перевода строк и пустая строка между ними.


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
СообщениеДобавлено: 24 ноя 2009, 16:22 
Неотъемлемая часть форума

У нас с: 12.04.2004
Сообщения: 435
Откуда: г. Владивосток
Не знаю как в винде, а в линуксе всё выводится сообразно программе. Во-первых, у тебя две переменных: total_strings и string_count и счётчик строк выводит первую переменную, а номер строки - вторую. Кроме того, для последней строки string_count увеличивается (в результате номера строк пишутся правильно), а total_strings - нет (общее количество строк получается на единицу меньше). Ну а с нулём тоже всё просто. В конце последней строки в файле стоит '\n'. Программа на нём сбрасывает счётчик символов и увеличивает отсчёт строк. Ну а следующий прочитаный символ - это EOF. После EOFа у тебя выводится инфа о последней строки, которая получается пустой.

Как вся эта хрень умудрялась работать под виндой я не знаю. Вероятно, код, всё-таки, не одинаков был.


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
СообщениеДобавлено: 27 ноя 2009, 21:21 
Заглянувший

У нас с: 11.10.2009
Сообщения: 4
michael писал(а):
Не знаю как в винде, а в линуксе всё выводится сообразно программе. Во-первых, у тебя две переменных: total_strings и string_count и счётчик строк выводит первую переменную, а номер строки - вторую. Кроме того, для последней строки string_count увеличивается (в результате номера строк пишутся правильно), а total_strings - нет (общее количество строк получается на единицу меньше). Ну а с нулём тоже всё просто. В конце последней строки в файле стоит '\n'. Программа на нём сбрасывает счётчик символов и увеличивает отсчёт строк. Ну а следующий прочитаный символ - это EOF. После EOFа у тебя выводится инфа о последней строки, которая получается пустой.

Как вся эта хрень умудрялась работать под виндой я не знаю. Вероятно, код, всё-таки, не одинаков был.


Спасибо за ответ. А как исправить код чтобы всё работало как надо?


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
[ All resources are available under GNU GPL ] [ Support ] [ Hosted by DataHata | MyCloud.by ] [ Powered by phpBB® Forum Software © phpBB Group ]

LVEE Winter LVEE Rambler's Top100