Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2011, 20:39   #1
Алексей Емеля
Пользователь
 
Аватар для Алексей Емеля
 
Регистрация: 13.06.2011
Сообщений: 23
По умолчанию Подсчет строк в файле в Linux.

Помню в винде писал прогу, где надо было посчитать количество строк в файле (у меня это получилось). Перешел на Linux Mint, переписал алгоритм, но в терминале при запуске выдает Segmentatin Fault. Никак не пойму в чем проблема. Помогите с этим. Скажите что не так. Лично я думаю что это изза EOF. В общем вот исходник:

#include<iostream>
#include<stdio.h>
using namespace std;

int _n( FILE *f ) // Функция, считающая строки в файле
{
int k = 0;
char a;// Каждый символ в файле
do
{
a = fgetc(f);
if( a == '\n') // Если символ перевода строки то
k++; // На одну строку больше
} while( a != EOF ); // До тех пор, пока файл не закончится
return k;
}

int main()
{
int k;
FILE *f = fopen("base.txt", "r");
k = _n(f) / 7;
cout << k << endl;
return 0;
}

Компилировал в IDE Geany.
Дорога в тысячу миль начинается с одного шага.
Алексей Емеля вне форума Ответить с цитированием
Старый 13.06.2011, 20:44   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Попробуй у a сделать тип int. Где-то читал что EOF не влазит в char)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 13.06.2011, 20:47   #3
Алексей Емеля
Пользователь
 
Аватар для Алексей Емеля
 
Регистрация: 13.06.2011
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Попробуй у a сделать тип int. Где-то читал что EOF не влазит в char)
Изменил. То же самое сообщение пишет.

*********************************** *********************

Заметил такую штуку - если вывести что нибудь в самом начале ( сразу после скобочки, где начинается функция main), то программа ничего не выводит, и выдает ту же ошибку. Но если я запущу другую программу, то там все нормально.
Дорога в тысячу миль начинается с одного шага.

Последний раз редактировалось Алексей Емеля; 13.06.2011 в 20:51. Причина: Добавления
Алексей Емеля вне форума Ответить с цитированием
Старый 13.06.2011, 20:49   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ммм, а файл base.txt есть рядом с программой? Добавьте проверку:
Код:
FILE* f = fopen("base.txt", "r");

if (f == NULL) {
  perror("Can't open file");
  return -1;
}
..
netrino вне форума Ответить с цитированием
Старый 13.06.2011, 20:56   #5
Алексей Емеля
Пользователь
 
Аватар для Алексей Емеля
 
Регистрация: 13.06.2011
Сообщений: 23
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Ммм, а файл base.txt есть рядом с программой? Добавьте проверку:
Код:
FILE* f = fopen("base.txt", "r");

if (f == NULL) {
  perror("Can't open file");
  return -1;
}
..

Мне ваш код в программу даже не пришлось вставлять - я сразу вспомнил, что полный вариант программы в другой папке, где лежит этот файл Спасибо
Дорога в тысячу миль начинается с одного шага.
Алексей Емеля вне форума Ответить с цитированием
Старый 13.06.2011, 21:00   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
a = fgetc(f);
узнай размер файла, выдели память, равную размеру, считай весь файл разом, потом уже считай кол во \n
либо читай построчно (getline)

а если все-таки пишешь на плюсах, то можно как то так:
Код:
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <functional>
#include <fstream>
#include <memory>

using namespace std;

int main(int argc, char *argv[])
{
    cout << count_if(istreambuf_iterator<char>(*auto_ptr<fstream>(new fstream(argv[1]))),
            istreambuf_iterator<char>(),
            bind2nd(equal_to<char>(), '\n')) << endl;
}
но так же читает по одному символу
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 13.06.2011 в 21:43.
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие файла из OpenDialog, подсчет символов в файле disaer Общие вопросы C/C++ 2 24.09.2010 11:10
Макрос на сравнение и подсчет в первом столбце строк, и сумирование значений этих строк в другом столбце Shpr0T Microsoft Office Excel 8 30.08.2010 17:52
Подсчет строк masterdela Microsoft Office Excel 2 13.10.2009 16:42
Подсчет строк в БД nowmax БД в Delphi 6 30.03.2009 16:45
Подсчет русских и английских букв в текстовом файле. Ветас Помощь студентам 6 15.01.2009 22:08