powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / почему printf не печатает строку в консоли ?
25 сообщений из 87, страница 1 из 4
почему printf не печатает строку в консоли ?
    #39974981
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <wctype.h>
#include <errno.h>
#include <locale.h>

int main(int argc, char **argv) {
	wchar_t ch;
	setlocale(LC_ALL, "en_US.utf8");
	short end_of_word = 0;
	FILE *fp;
	fp = fopen("data/sample.txt", "r");
	if (fp == NULL) {
		printf("Unable to open the file.\n");
		return 1;
	}

	while( !feof(fp) ) {
		ch = fgetwc(fp);
		while(iswalpha(ch)) {
			putwchar(ch);
			ch = fgetwc(fp);
			end_of_word = 1;
		}

		if (end_of_word) {
			putwchar(' ');
			end_of_word = 0;
		}

	}
	putwchar('\n');
        
        // вот эта строка не печатается. почему?
	printf("\n*** END OF FILE ***\n");
	return 0;
}
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39974993
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм...

Вот этот цикл КМК имеет слабо-доказуемое условие останова.

Код: plaintext
1.
while(iswalpha(ch)) {
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975000
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <wctype.h>
#include <errno.h>
#include <locale.h>

int main(int argc, char **argv) {
	wchar_t ch;
	setlocale(LC_ALL, "en_US.utf8");
	short end_of_word = 0;
	FILE *fp;
	fp = fopen("data/sample.txt", "r");
	if (fp == NULL) {
		printf("Unable to open the file.\n");
		return 1;
	}
        // если добавить эту строку, то все норм распечатывается
	printf("\n*** BEGINNING OF FILE ***\n");
	while( !feof(fp) ) {
		ch = fgetwc(fp);
		while(iswalpha(ch)) {
			putwchar(ch);
			ch = fgetwc(fp);
			end_of_word = 1;
		}

		if (end_of_word == 1) {
			putwchar(' ');
			end_of_word = 0;
		}

	}
	putwchar('\n');

    // вот эта строка не печатается. почему?
	printf("\n*** END OF FILE ***\n");
	return 0;
}
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975001
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

Ваша проблема элементарно решается в отладчике. И можно было бы конкретизировать вопрос.
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975003
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

И кстати, а почему у вас кодировка utf8, а читаете вы wchar_t? Это разные вещи ваще. :)
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975005
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Хм...

Вот этот цикл КМК имеет слабо-доказуемое условие останова.

Код: plaintext
1.
while(iswalpha(ch)) {



проблемы с бесконечным циклом тут нет:
в самом крайнем случае мы дойдем до конца файла, и ch получит значение (W)EOF, тогда цикл должен остановиться
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975009
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mini.weblab,
И кстати, а почему у вас кодировка utf8, а читаете вы wchar_t? Это разные вещи ваще. :)


1)
а чем же читать utf8???
2)
а на что смотреть в отладчике?

в общем, petrav, говорите, что нужно сделать, потому что я застряла
:-)
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975010
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
mayton
Хм...

Вот этот цикл КМК имеет слабо-доказуемое условие останова.

Код: plaintext
1.
while(iswalpha(ch)) {



проблемы с бесконечным циклом тут нет:
в самом крайнем случае мы дойдем до конца файла, и ch получит значение (W)EOF, тогда цикл должен остановиться

Обоснуй почему обрамляющий цикл должен завершиться. Там break? Или throw exception?
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975015
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
petrav
mini.weblab,
И кстати, а почему у вас кодировка utf8, а читаете вы wchar_t? Это разные вещи ваще. :)


1)
а чем же читать utf8???
2)
а на что смотреть в отладчике?

в общем, petrav, говорите, что нужно сделать, потому что я застряла
:-)

Если файл в utf-8 то каждый символ занимает от одного до четырёх байт. Вы символы пытаетесь читать в 2-ва байта и анализировать. Не знаю как это может работать, а если в файле ещё и BOM...

В отладчике смотреть, что за данные, почему зациклились и т.д.
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975017
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	while( !feof(fp) ) { 
        /* этот цикл завершится, когда дойдем до конца файла */
		ch = fgetwc(fp);
		while(iswalpha(ch)) { 
                 /* этот цикл завершится когда дочитаем до конца файла, ch получит значение EOF (non alphabetic character!) */
			putwchar(ch);
			ch = fgetwc(fp);
			end_of_word = 1;
		}

		if (end_of_word) {
			putwchar(' ');
			end_of_word = 0;
		}

	}


feof: https://en.cppreference.com/w/c/io/feof
iswalpha: https://en.cppreference.com/w/c/string/wide/iswalpha
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975019
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(раскачиваясь на стуле)

Не знаю. Не нравится мне такой подход. Есть функция. iswalpha()
У нее - детерминированное поведение для символов. EOF - это аналог null.
Отсутствие символа. В некоторых источниках пишут что EOF = -1
И кажется где-то у нас даже топик был по поводу EOF. Копья ломали...

Не знаю. Не могу я принять такое в code-review. Какая-то кастомизация.
А если-б EOF был равен "дохлой корове" ?
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975022
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, а ты, дорогая мне не кидай линки на справочник. Твоя позиция - слабая.
Твой код - нерабочий. И ты здесь доказываешь правоту неработающего кода просто
вместо того чтобы устранить спорный момент или просто code-smell.

Ну пиши больше code-smells. Разви-ж я тебя остановлю? Дай бох чтоб коллеги критиковали.
Мой-то совет тебе я так понимаю не нужен.

Что отладчик показывает? Зациклилась?
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975023
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
1)
у меня wchar_t занимает 4 байта (я знаю, что размер wchar_t зависит от компилятора и это плохое решение)
2)
как же мне прочитать UTF8?? (чтобы можно было функции использовать из wchar.h ??)
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975025
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
petrav,
1)
у меня wchar_t занимает 4 байта (я знаю, что размер wchar_t зависит от компилятора и это плохое решение)
2)
как же мне прочитать UTF8?? (чтобы можно было функции использовать из wchar.h ??)

Не знаю. Там вообще много подводных камней. Я бы читал сразу целыми строками, а не посимвольно.
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975027
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
mini.weblab, а ты, дорогая мне не кидай линки на справочник. Твоя позиция - слабая.
Твой код - нерабочий. И ты здесь доказываешь правоту неработающего кода просто
вместо того чтобы устранить спорный момент или просто code-smell.

Ну пиши больше code-smells. Разви-ж я тебя остановлю? Дай бох чтоб коллеги критиковали.
Мой-то совет тебе я так понимаю не нужен.

Что отладчик показывает? Зациклилась?


линки я для удобства накидала, а не потому что в тебе сомневаюсь :-)
я не доказываю свою правоту, просто я объясняю, почему я так сделала,
уж я-то знаю что код не рабочий, но не могу понять почему.
просто если я не объясню почему я так сделала, как же ты поймешь, что мне непонятно?

а конструктивную критику я во внимание всегда принимаю
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975029
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
mayton
mini.weblab, а ты, дорогая мне не кидай линки на справочник. Твоя позиция - слабая.
Твой код - нерабочий. И ты здесь доказываешь правоту неработающего кода просто
вместо того чтобы устранить спорный момент или просто code-smell.

Ну пиши больше code-smells. Разви-ж я тебя остановлю? Дай бох чтоб коллеги критиковали.
Мой-то совет тебе я так понимаю не нужен.

Что отладчик показывает? Зациклилась?


линки я для удобства накидала, а не потому что в тебе сомневаюсь :-)
я не доказываю свою правоту, просто я объясняю, почему я так сделала,
уж я-то знаю что код не рабочий, но не могу понять почему.
просто если я не объясню почему я так сделала, как же ты поймешь, что мне непонятно?

а конструктивную критику я во внимание всегда принимаю

Добавь вывод текущего символа на экран в hex code. И мы быстро диагностируем проблему.
Код: plaintext
1.
2.
3.
while( !feof(fp) ) {
 ch = fgetwc(fp);
 printf("Fucken hex code : ....", ch);
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975031
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
1)
по строка прочитать не проблема, только я не понимаю, как это может помочь
проблема в том, что в стандатной библиотеке, нет стандартного решения для работы с UTF8, т.е надо брать либо готовую библиотеку, которая уже умеет это делать, либо писать все с нуля

2)
я не знаю на что смотреть в дебагере, я прошлась по всем командам, и зацикливания не было, но
последний printf в первом примере кода почему-то не выводится (а во втором - все нормально)
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975033
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabкак же мне прочитать UTF8?? (чтобы можно было функции использовать из wchar.h ??)

Читай как char. Потом перекодируй в wchar_t любым доступным способом: от iconv до
самопальной процедуры в пять строчек.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975037
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
1) последние строки после файлового текста не печатаются
Код: plaintext
1.
2.
(gdb) print ch
$1 = -1 L'\xffffffff'



2) все нормально распечатывается
Код: plaintext
1.
2.
(gdb) print ch
$1 = -1 L'\xffffffff'


Это я в printf напечатала
ch last: 000000000000000000000000FFFFFFFF
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975051
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
petrav,
1)
по строка прочитать не проблема, только я не понимаю, как это может помочь
проблема в том, что в стандатной библиотеке, нет стандартного решения для работы с UTF8, т.е надо брать либо готовую библиотеку, которая уже умеет это делать, либо писать все с нуля


Читаешь сразу всю строку в char[], потом попробуй std::mbrlen. Но что дальше делать я не знаю если нужно работать именно в utf-8.

mini.weblab
2)
я не знаю на что смотреть в дебагере, я прошлась по всем командам, и зацикливания не было, но
последний printf в первом примере кода почему-то не выводится (а во втором - все нормально)

Ну да что-то странное у тебя творится или ты воспринимаешь странно.
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975065
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

общая задача была прочитать и вывести все слова из файла.

1) я хотела сделать бэкэнд для WordCloud, поэтому UTF8 (это для практики)

2) по поводу пункта 2: я там вижу один баг: незакрытый файл. но это не объяснятет странное поведение printf.
выглядит так как будто там разные потоки для putwchar и printf
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975076
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Норм. Печатается вроде-бы

Код: plaintext
1.
2.
3.
4.
5.
6.
mayton@ryzen-ssd:~/cpp$ ./word_count.exe word_count.c 

*** BEGINNING OF FILE ***
include stdio h include stdlib h include wchar h include wctype h include errno h include locale h int main int argc char argv wchar t ch setlocale LC ALL en US utf short end of word FILE fp if argc printf nUsage word count filename n n fp fopen argv r if fp NULL printf Unable to open the file n return 5A;8 4>1028BL MBC AB@>:C B> 2A5 =>@< @0A?5G0BK205BAO printf n BEGINNING OF FILE n while feof fp ch fgetwc fp while iswalpha ch putwchar ch ch fgetwc fp end of word if end of word putwchar end of word putwchar n 2>B MB0 AB@>:0 =5 ?5G0B05BAO ?>G5<C printf n END OF FILE n return 

*** END OF FILE ***



Код: plaintext
1.
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 



Версия о раздельных буферах для форматной печати - правдоподобна. Надо просто почитать об этом.
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал немного. Для сплита на слова - удобнее не альфа-символы проверять а все-все символы
что не являются разделителями. Так точнее.

Да этот BOM еще мешает спереди.

readme.txt
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Съешь еще этих грёбаных французских булок да выпей йаду.

Hoola-hoola girls like hooligans.

Быстрая коричневая лиса прыгнула через ленивого собака.

If you want to fuck so funny - fuck yourself and save a money.



word_count.c
Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <wctype.h>
#include <errno.h>
#include <locale.h>

int main(int argc, char **argv) {
    wchar_t ch;
    setlocale(LC_ALL, "en_US.utf8");
    short end_of_word = 0;
    FILE *fp;
    if (argc == 0) {
        printf("\nUsage: word_count [filename]\n\n");
        return 1;
    }
    fp = fopen(argv[1], "r");
    if (fp == NULL) {
	printf("Unable to open the file.\n");
	return 1;
    }
    
    wchar_t prev_ch = fgetwc(fp);
    if (!iswspace(ch)) {
        putwchar(ch);
    }

    while(!feof(fp) ) {
	ch = fgetwc(fp);
        if (!iswspace(ch)) {
            putwchar(ch);
        } else if (!iswspace(prev_ch) && iswspace(ch)) {
	    putwchar('\n');
        } 
        prev_ch = ch;
    }

    return 0;
}



Вот здесь первый символ - херня какая-то. Чортов бим-бом.
Код: plaintext
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.
mayton@ryzen-ssd:~/cpp$ ./word_count.exe readme.txt 
&#32765;ъешь
еще
этих
грёбаных
французских
булок
да
выпей
йаду.
Hoola-hoola
girls
like
hooligans.
Быстрая
коричневая
лиса
прыгнула
через
ленивого
собака.
If
you
want
to
fuck
so
funny
-
fuck
yourself
and
save
a
money.



Вообще надо на С++ переходить.
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975090
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот этот же текстовый файл - сквозь призму hexdump.

Вобщем первые два байта d0 a1 - это как раз буква "C" в первом предложении. BOM-заголовка нет.
Так мой Midnight Commander создает текстовые файлы utf-8. А наше приложение что-то имеет
на этот счет. И глотает первую букву оставляя мусор.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
mayton@ryzen-ssd:~/cpp$ hexdump -C readme.txt 
00000000  d0 a1 d1 8a d0 b5 d1 88  d1 8c 20 d0 b5 d1 89 d0  |.......... .....|
00000010  b5 20 d1 8d d1 82 d0 b8  d1 85 20 d0 b3 d1 80 d1  |. ........ .....|
00000020  91 d0 b1 d0 b0 d0 bd d1  8b d1 85 20 d1 84 d1 80  |........... ....|
00000030  d0 b0 d0 bd d1 86 d1 83  d0 b7 d1 81 d0 ba d0 b8  |................|
00000040  d1 85 20 d0 b1 d1 83 d0  bb d0 be d0 ba 20 d0 b4  |.. .......... ..|
00000050  d0 b0 20 d0 b2 d1 8b d0  bf d0 b5 d0 b9 20 d0 b9  |.. .......... ..|
00000060  d0 b0 d0 b4 d1 83 2e 0a  0a 48 6f 6f 6c 61 2d 68  |.........Hoola-h|
00000070  6f 6f 6c 61 20 67 69 72  6c 73 20 6c 69 6b 65 20  |oola girls like |
00000080  68 6f 6f 6c 69 67 61 6e  73 2e 0a 0a d0 91 d1 8b  |hooligans.......|
00000090  d1 81 d1 82 d1 80 d0 b0  d1 8f 20 d0 ba d0 be d1  |.......... .....|
000000a0  80 d0 b8 d1 87 d0 bd d0  b5 d0 b2 d0 b0 d1 8f 20  |............... |
000000b0  d0 bb d0 b8 d1 81 d0 b0  20 d0 bf d1 80 d1 8b d0  |........ .......|
000000c0  b3 d0 bd d1 83 d0 bb d0  b0 20 d1 87 d0 b5 d1 80  |......... ......|
000000d0  d0 b5 d0 b7 20 d0 bb d0  b5 d0 bd d0 b8 d0 b2 d0  |.... ...........|
000000e0  be d0 b3 d0 be 20 d1 81  d0 be d0 b1 d0 b0 d0 ba  |..... ..........|
000000f0  d0 b0 2e 0a 0a 49 66 20  79 6f 75 20 77 61 6e 74  |.....If you want|
00000100  20 74 6f 20 66 75 63 6b  20 73 6f 20 66 75 6e 6e  | to fuck so funn|
00000110  79 20 2d 20 66 75 63 6b  20 79 6f 75 72 73 65 6c  |y - fuck yoursel|
00000120  66 20 61 6e 64 20 73 61  76 65 20 61 20 6d 6f 6e  |f and save a mon|
00000130  65 79 2e 0a                                       |ey..|
00000134
...
Рейтинг: 0 / 0
почему printf не печатает строку в консоли ?
    #39975098
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А вот этот же текстовый файл - сквозь призму hexdump.

Вобщем первые два байта d0 a1 - это как раз буква "C" .


я с тобой не согласна, d0 a1 это 4 байта, а вообще последнее время ты слишком бурно на все реагируешь.
...
Рейтинг: 0 / 0
25 сообщений из 87, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / почему printf не печатает строку в консоли ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]