1

Тема: Друк к-сті символів у файлі (txt)

Доброго вечора! У мене таке завдання було: Написати програму, яка зчитує текст із файлу (кілька пропозицій) та виводить його на екран. Після кожного речення друкується кількість символів у ньому.
Написала код, але некоректно виводиться кількість символів у рядку, а також взагалі зникає напис.
Ось код.

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define max 150

int main ()
{
    setlocale(LC_ALL, "uk_UA.UTF-8");
    SetConsoleCP(1251);
    SetConsoleOutputCP(CP_UTF8); //
    FILE * fp;
    char words[max];
    fp = fopen("C:\\Users\\Аня\\Documents\\textt.txt", "r");
    if (fp == NULL) 
    {
        printf("\n\tПомилка відкриття файлу\n");
        exit(1);
    }
    while (fgets(words, max, fp) != NULL) 
    {
        printf("%s", words);
        printf("Кількість символів у рядку: %d\n", strlen(words));
    }
    fclose(fp);
    return 0;
}

fp = fopen("C:\\Users\\Аня\\Documents\\textt.txt", "r"); - Тут даю повноцінний шлях до файлу, який створила, бо інакше компілятор не бачить.
printf("Кількість символів у рядку: %d\n", strlen(words)); - "Кількість символів у рядку" взагалі зникає при компіляції, але саме число виводиться (невірно, додає приблизно 10-15 символів, тобто, якщо речення "Привіт", то воно напише не 6 символів, а 16-20).
Поясніть будь-ласка, у чому може бути справа? Невірно щось задане через консоль? Права на читання файлів .txt у мене є, усе нібито робе, сам текст файлу виводиться, а  printf("Кількість символів у рядку: %d\n", strlen(words)); - Ні

2

Re: Друк к-сті символів у файлі (txt)

Все майже коректно повинно працювати. І в даному конкретному випадку компілятору повинно бути пофік де знаходиться текстовий файл на етапі компіляції.

Моя особлива думка.
Поступово відучіть себе використовувати setlocale. В функції printf та аналогічних вказуйте англомовні речення без символів кирилиці.
Шлях до файлу: ім'я файлу, і ні чого зайвого. Файл розміщуйте в теці з файлом аплікації. Згодом навчитеся вказувати шлях в аплікації вже при її виконанні.

3 Востаннє редагувалося Droid 77 (27.03.2023 22:27:00)

Re: Друк к-сті символів у файлі (txt)

Спробуйте ось так:

Похідний код
#include <stdio.h>
#include <string.h>

#define max 255

int main ()
{
    FILE * fp;
    char words[max];
    fp = fopen("text.txt", "r");
    if (fp == NULL) 
    {
        printf("Error Open File\n");
        exit(1);
    }
    while (fgets(words, max, fp) != NULL) 
    {
        printf("%s", words);
        printf("String character counter status: %d\n", strlen(words+1));
    }
    fclose(fp);
    return 0;
}

4

Re: Друк к-сті символів у файлі (txt)

strlen насправді рахує не символи, а однобайтні символи. Якщо файл містить текст з кириличними літерами в кодуванні utf-8, то strlen покаже кількість байтів у ньому, яких буде більше, ніж символів (бо кожна кирилична літера в utf-8 кодується двома байтами). Спробуйте зберегти цей же файл у кодуванні windows-1251 (воно ж windows-кирилиця), або переписати його англійською — тоді кожен символ кодуватиметься одним байтом, і такого розходження не буде.

5

Re: Друк к-сті символів у файлі (txt)

MaxPluto написав:

"Кількість символів у рядку" взагалі зникає при компіляції

Саме цей рядок зникає, а не рядок з файлу, що виводиться перед ним? Просто зникнення рядка з файлу при виводі на екран більш очікуване. Справа в тому, що у windows у текстових файлах наприкінці рядка додається керуючий символ '\r', який при виводі на екран переводить курсор на початок рядка. Якщо це справді так, то printf("%s", words); виведе рядок і переведе курсор на початок, після чого поверх нього надрукується те, що виводиться наступним printf'ом.

Можна обійти цю проблему, якщо при виводі рядка з файлу одразу ж відбуватиметься перехід на наступний рядок:

printf("%s\n", words);
Подякували: leofun011