Форум программистов, компьютерный форум CyberForum.ru

Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI - C++

Восстановить пароль Регистрация
 
niks255
1 / 1 / 0
Регистрация: 21.05.2013
Сообщений: 29
24.05.2013, 21:36     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #1
Здравствуйте. Имеется программка, которая читает текст из файла, обрабатывает его и записывает результат в другой текстовый файл. Проблема:
Не читает текст из файла, если кодировка отлична от кириллицы.
Исходники в приложенном файле. Пишу в Visual Studio 2010.
Вложения
Тип файла: 7z Task 7.7.7z (6.84 Мб, 14 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.05.2013, 23:00     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #2
Вот в формате *.rar
кстати, у меня всё заработало, в файл formatd.txt записалась нормальная кириллица
может проблема в винде?
Вложения
Тип файла: rar Task 7.7.rar (8.61 Мб, 8 просмотров)
niks255
1 / 1 / 0
Регистрация: 21.05.2013
Сообщений: 29
24.05.2013, 23:12  [ТС]     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #3
Выложу под спойлерами.
Файл Task 7.7.cpp
Кликните здесь для просмотра всего текста

C++
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// Task 7.7.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <string>
#include <stdlib.h>
#include <iostream>
#include "edit.h"
using namespace std;
 
/// глобальные переменные
const int maxl_line=63;
const int margin=5;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    FILE* finp;
    FILE* fout;
    char line[maxl_line+1];
    int b_i, a_i, start, next, inter;
    int nword = 0;
    cout<<"Работает программа Task 7.7"<<endl;
    if (!(finp=fopen("unform.txt", "r")))
    {
        cout<<"Файл не найден"<<endl;
        exit(0);
    }
    cout<<"Читается файл unform.txt"<<endl;
    if (!(fout=fopen("formatd.txt", "w")))
    {
        cout<<"Файл formatd.txt не создан"<<endl;
    }
    cout<<"Выполняется запись в файл formatd.txt"<<endl;
    while(GetLine(finp, line))
    {
        DefInter(line, b_i, a_i, inter);
        PutInterval(fout, margin);
        next=PutWord(fout, line, 0, nword);
    
        for (int i=0; i<inter; i++)
        {
            start=SearchNextWord(line, next);
            PutInterval(fout, b_i);
            if (a_i) {a_i--;PutInterval(fout, 1);}
            next=PutWord(fout, line, start, nword);
            if (!next) break;
        }
        fprintf(fout, "\n");
    }
    printf("\nКоличество слов - %d\n", nword);
    fclose(fout);
    cout<<"Работа завершена"<<endl;
    system("pause");
    return 0;
}

Файл edit.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
// Прототипы функций
void DefInter(const char* pline, int& base_int, int& add_int, int& inter);
int GetLine(FILE*, char*);
void PutInterval(FILE*, const int);
int PutWord(FILE*, const char*, const int, int&);
int SearchNextWord(const char*, const int);
// глобальные переменные
extern const int maxl_line;

Файл edit.cpp
Кликните здесь для просмотра всего текста

C++
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include "StdAfx.h"
#include <string>
#include "edit.h"
 
int GetLine(FILE* finp, char* pline)
 
{
    int i=0;
    char c;
    while ((c=fgetc(finp))==' ') i++;
    if (c == EOF)
        return 0;
    fseek(finp, -1, SEEK_CUR);
    fgets(pline, maxl_line - i+1, finp);
        pline[strlen(pline) - 1] = 0;
        return 1;
}
 
int SearchNextWord(const char* pline, const int curpos)
 
{
    int i = curpos;
    while(pline[i] != ' '){
        if (pline[i] == '\n') return 0;
        i++;
    }
    while (pline[i] == ' ' && pline[i+1] == ' ') i++;
    return i+1;
 
}
 
void DefInter(const char* pline, int& base_int, int& add_int, int& inter)
{
    int k = 0, end;
    end = strlen(pline) - 1;
    while ((pline[end] == ' ') || (pline[end] == '\n') || (pline[end] == '\r')) end--;
    inter = 0;
 
for (unsigned int i = 0; i < end; i++)
{
    if (pline[i] == ' ')
    {
        k++;
        if (pline[i+1] != ' ') inter++;
    }
}
int blank_amount = k + maxl_line - end;
if (!k)
{
    base_int = 0;
    add_int = 0;
}
else
{
    base_int = blank_amount / inter;
    add_int = blank_amount % inter;
}
return;
}
 
int PutWord (FILE* fout, const char* pline, const int startpos, int& n){
 
    int i = startpos;
    char c;
 
    n++;
    while ((c = pline[i++]) != ' ')
    {
        fprintf(fout, "%c" ,c);
        if ((c == '\n') || (c == '\0')){i = 0; break;}
    }
    return i - 1;
}
 
    void PutInterval(FILE* fout, const int k)
    {
        for (int i = 0; i < k; i++) fprintf(fout, " ");
        return;
    }


Добавлено через 11 минут
Цитата Сообщение от Olivеr Посмотреть сообщение
Вот в формате *.rar
кстати, у меня всё заработало, в файл formatd.txt записалась нормальная кириллица
может проблема в винде?
Там проблема не с кириллицей. Кириллицу он пишет, но только если в исходном документе кодировка ANSI. Если UTF-8 например, то кракозябры пишет в конечный файл. Создаю файл в блокноте. Тут в соседнем форуме подсказали что блокнот не лучшее средство для таких дел т.к. он что то с документом не то вытворяет. Но код надо бы проверить.
Винда Windows 7 x64.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.05.2013, 23:18     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #4
niks255, попробуйте поюзать Notepad++. В нем можно выбрать кодировку.
niks255
1 / 1 / 0
Регистрация: 21.05.2013
Сообщений: 29
24.05.2013, 23:55  [ТС]     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #5
Olivеr, Да в блокноте тоже можно. Только его кодировку почему-то программа не понимает.
А в коде все в порядке?

Добавлено через 25 минут
Кстати, если в блокноте выбираю Юникод то он вообще символов в документе не видит и formatd.txt получается пустой. Мне интересно почему так происходит и можно ли это обойти.
niks255
1 / 1 / 0
Регистрация: 21.05.2013
Сообщений: 29
28.05.2013, 15:57  [ТС]     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #6
А помогите пожалуйста добавить в программу подсчет количества строк в файле.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.05.2013, 16:20     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #7
Цитата Сообщение от niks255 Посмотреть сообщение
Кстати, если в блокноте выбираю Юникод то он вообще символов в документе не видит и formatd.txt получается пустой. Мне интересно почему так происходит и можно ли это обойти.
niks255, я же вам здесь объяснил: Собранное приложение завершается с ошибкой
niks255
1 / 1 / 0
Регистрация: 21.05.2013
Сообщений: 29
28.05.2013, 16:22  [ТС]     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы же мне и посоветовали тему создать и спросить.
Помогите дописать подсчет строк в текстовом файле, черт с ним с юникодом.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.05.2013, 16:25     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #9
Цитата Сообщение от niks255 Посмотреть сообщение
Вы же мне и посоветовали тему создать и спросить.
Зачем спрашивать то, на что уже написано объяснение? Или в нём что-то непонятно?
niks255
1 / 1 / 0
Регистрация: 21.05.2013
Сообщений: 29
28.05.2013, 18:10  [ТС]     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #10
alsav22, вы это позже сделали когда я уже тему создал.

Добавлено через 1 час 24 минуты
Короче, помогите пожалуйста дописать функцию подсчета количества строк. Я не очень представляю как оно должно выглядеть.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.05.2013, 19:41     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #11
Если я правильно понял, то строки из файла у вас читает GetLine() в цикле while(). Поставьте в цикле счётчик итераций, это и будет количество вызовов функции GetLine(), т.е. количество считанных ёю строк.
niks255
1 / 1 / 0
Регистрация: 21.05.2013
Сообщений: 29
29.05.2013, 14:32  [ТС]     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #12
alsav22,
Я поначалу так и сделал. Но программу выкидывает если есть пустая строка хоть одна. Например, в конце текста перевести курсор на следующую строку и оставить пустой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 15:31     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI
Еще ссылки по теме:

Программа, которая считывает текст из файла, и выводит на экран только цитаты C++
C++ Программа не считывает с файла текст полностью
C++ Программа не обрабатывает файлы больше 100 килобайт

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.05.2013, 15:31     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI #13
Я что-то вас не пойму. У вас код работает? Если работает, то добавление счётчика ничего в коде не меняет. Если не работает при наличии пустой строки, то это уже другой вопрос, и причём здесь, тогда, подсчёт строк? Что стоит после последней строки в файле определяет то, как нужно корректно организовать выход из чтения. Так что нужно определиться: стоит '\n' или EOF.

Добавлено через 35 минут
Пустые строки в конце файла этот код правильно обрабатывает. Чтобы не было вылетов при наличии пустых строк в середине файла, и если их не нужно подсчитывать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while(GetLine(finp, line))
    {
        if (line[0] != '\0')
        {
            DefInter(line, b_i, a_i, inter);
            PutInterval(fout, margin);
            next=PutWord(fout, line, 0, nword);
    
            for (int i=0; i<inter; i++)
            {
                start=SearchNextWord(line, next);
                PutInterval(fout, b_i);
                if (a_i) {a_i--;PutInterval(fout, 1);}
                next=PutWord(fout, line, start, nword);
                if (!next) break;
            }
            fprintf(fout, "\n");
            ++k;
        }
    }
    printf("\nКоличество строк - %d\n", k);
    printf("\nКоличество слов - %d\n", nword);
    fclose(fout);
Добавлено через 8 минут
Если нужно подсчитывать и пустые, то переместить ++k за if().
Yandex
Объявления
29.05.2013, 15:31     Программа не обрабатывает текст из файла с кодировкой, отличной от ANSI
Ответ Создать тему
Опции темы

Текущее время: 21:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru