LINUX.ORG.RU

Проверка того, является ли символ символом конца строки


0

0

Короче говоря- нужно проверить. является ли символ, получаемый посредством fgetc() из файла символом перевода/конца строки. Пробовал через strcmp(fgetc(f),«\n»), не работает. Как же всё- таки осуществить такую проверку? Заранее благождарен тем, кто поможет.

★★

#include <stdio.h>
#include <unistd.h>
//unistd.h is needed for access() function
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <string.h>
struct stat b;
int i;
int help();
int main(int argc, char **argv)
{
	if(argc==3) if(!strcmp(argv[1],"-n")||!strcmp(argv[1],"--numbering")){
		FILE *f=fopen(argv[1],"r");
		i=1;
		int a;
		printf("1:");
		while(feof(f)==0){
			a=fgetc(f);
			if(fgetc(f)=="\n")printf("\n%d: ",++i);
			else putchar(a);
		}
	}
		else help();
	else if(argc==1||!strcmp(argv[1],"-h")||!strcmp(argv[1],"--help")) help();
	else{
		if(!strcmp(argv[1],"-v")||(!strcmp(argv[1],"--version"))){
		printf("cloncat version 0.2\n");
		return 0;
	}
	else{
	if(access(argv[1],0)==-1){
		printf("File %s does not exist.\n",argv[1]);
		return 1;
	}
	else if(access(argv[1],4)==-1){
		stat(argv[1],&b);
		printf("You don't have rights to read this file.\n"
		"Rights for this file:\nAccess mode: %o\nOwnership: UID: %d "
		"GID: %d\nLast access time: %sLast status change time: %s"
		"Last change time: %s",b.st_mode,b.st_uid,b.st_gid,ctime(&b.st_atime),ctime(&b.st_mtime),ctime(&b.st_ctime));
		return 1;
	}
	else {
		stat(argv[1], &b);
		if((b.st_mode & S_IFDIR) == S_IFDIR){
			printf("File %s is a directory.\n",argv[1]);
			return 1;
		}
	}
		FILE *f=fopen(argv[1],"r");
		while(feof(f)==0){
			putchar(fgetc(f));
		}
		fclose(f);
	}
}
return 0;
}
int help(){
		printf("usage: cloncat filename\n"
		"-h or --help for help\n"
		"-v or --version displays version and exit\n");
		return 0;
	}
Dorif ★★
() автор топика
Ответ на: комментарий от Dorif

Вот вы пишете:

Так ведь fgetc(f)=='\n' сегфолт и выдаёт

а в коде у вас:

fgetc(f)=="\n"
Видите разницу между ковычками?

И еще: перед тем как работать с потоком f, нужно проверить, не равен ли он NULL (если файл не открылся — fopen возвращает NULL).

edigaryev ★★★★★
()
Ответ на: комментарий от Dorif

>a=fgetc(f);

if(fgetc(f)==«\n»)printf(«\n%d: »,++i);


вот этот кусок в первом же цикле удивил. со '\n' сравниваете каждый 2-й символ? может, все-таки if (a == '\n')?

Кстати, в С «\n» и '\n' - очень разные вещи. Сравнивать строки (а не символы) операцией == бесполезно.

amomymous ★★★
()
Ответ на: комментарий от Dorif

Может вместо

a=fgetc(f); 
         if(fgetc(f)=="\n")printf("\n%d: ",++i); 
         else putchar(a); 

написать

a=fgetc(f); 
         if(a=='\n')printf("\n%d: ",++i); 
         else putchar(a); 

PS: строка != символ в C

vkos ★★
()
Ответ на: комментарий от edigaryev

Заменил кавычки. Один результат- сегфолт и всё тут. Касательно второго пункта: Ща прикручу проверку, но более полную.

Dorif ★★
() автор топика
Ответ на: комментарий от amomymous

Да поменял уже на одинарные, никакого результата.

Dorif ★★
() автор топика
Ответ на: комментарий от Dorif

f — это не имя файла, а указатель структуру FILE, которая содержит информацию, используемую при работе с файлом.

edigaryev ★★★★★
()
Ответ на: комментарий от edigaryev

Всё, теперь вроде разобрался с этим, спасибо.) Но всё же инетересно: как же узнать конец строки?

Dorif ★★
() автор топика
Ответ на: комментарий от edigaryev

Файл таки есть. В этом и прикол. Он у меня в Gedit Спокойно открывается. cat'ом выводится, этой же прогой(см сорцы) спокойно выводится, если нет аргуме5нта -n

Dorif ★★
() автор топика
Ответ на: комментарий от Dorif

Так вам уже написали ведь:

Читаем файл посимвольно, и проверяем, не является ли символ символом конца строки — \n.

В каком месте у вас возникает вопрос?

edigaryev ★★★★★
()
Ответ на: комментарий от Dorif

Покажите тогда вывод:

strace ваша_программа аргументы
Должен быть установлен strace.

edigaryev ★★★★★
()
Ответ на: комментарий от Dorif

советую обратить внимание на оформление кода

if (true) do_somting;
писать как
if (true) 
       do_somting;
не забываем про отступы.(желательно 8), можно заценить LKCS.
int c;
c = getc(file);
if (c == '\n')
        do_somting();

anonymous
()
Ответ на: комментарий от Dorif

Прикол в этом:

if(!strcmp(argv[1],"-n")||!strcmp(argv[1],"--numbering")){ 
      FILE *f=fopen(argv[1],"r"); 

Здесь написано открыть файл с имененм "-n"!

vkos ★★
()
Ответ на: комментарий от edigaryev

В том. что это выдаёт снегфолт.

while(feof(f)==0){
			a=fgetc(f);
			if(fgetc(f)=='\n')printf("\n%d: ",++i);
			else putchar(a);
		}
[alex@sharik ~]$ ./cloncat -n hreni
Ошибка сегментирования (core dumped)

Dorif ★★
() автор топика
Ответ на: комментарий от vkos

т.е. f == NULL, а может файл называется -n

anonymous
()
Ответ на: комментарий от Dorif

если у тебя там опции, то посмотри getopt(3) и getopt_long(3).

anonymous
()

Теперь другое... Вместо строчки IHEX firmware/yam/9600.bin прога выводит: 6989: IE2Wfrwr/esa_d/icmpsf

HX imaeym10.i

HX imaeym90.i

WTF?

Dorif ★★
() автор топика
Ответ на: комментарий от anonymous

Аналог.))) Хелловорды надоели, хочу попробовать что- то реально полезное попробовать.

Dorif ★★
() автор топика

Лучше бросайте своё хождение по граблям и срочно читайте Кернигана и Ритчи «Язык Си».

А потом Стивенса «Advanced Programming in the UNIX Environment».

Только тогда у вас, возможно, будет шанс не стать быдлокодером.

ntp
()
Ответ на: комментарий от ntp

Ви таки не поверите, но сейчас я как раз Кернигана и Ритчи и читаю «Язык программирования C» 2-е издание.А вторую книжку посмотрю. Может удастся через локальный магаз заказать. На всякий случай: какой надёжный книжный Интернет- магазин можете посоветовать?

Dorif ★★
() автор топика
Ответ на: комментарий от Dorif

Мы таки не поверим. Там есть программа подсчет строк.(стр. 25)

/* count lines in input */

int
main(int argc, char **argv)
{

        int c, nl;

        nl = 0;

        while ((c = getchar()) != EOF) {
                if (c == '\n')
                       ++nl;
        }

        printf("%d\n", nl);
        return 0;
}

anonymous
()
Ответ на: комментарий от Dorif

> Ви таки не поверите, но сейчас я как раз Кернигана и Ритчи и читаю

Если действительно читаете, то у вас странные ошибки - в книжке все это подробно разбирается. Видимо, дальше предисловия и оглавления еще не дошли?

Не ленитесь и выполняйте все упражнения. Они очень грамотно подобраны для развития навыков, да и на собеседованиях любят давать аналогичные задачки.

какой надёжный книжный Интернет- магазин можете посоветовать?

Амазон? У меня только chm с торрентов :-(

ntp
()
Ответ на: комментарий от anonymous

Знаю. её потом и зоюзал. В переделанном виде. И даж врубился, где я сплоховал.

Dorif ★★
() автор топика
Ответ на: комментарий от ntp

Да нет, я дошёл дальше, но решил так сказать сделать «отсебятину» и кой- где по невнимательности наляпал не то.)) Бывает.) А можно линк на торрент? Тож скачаю, почитаю.

Dorif ★★
() автор топика
Ответ на: комментарий от Dorif

> А можно линк на торрент?

Сходите на http://isohunt.com и наберите «Advanced Programming in the UNIX Environment (2nd edition).chm» в строке поиска.

ntp
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.