Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Ataraveski
1 / 1 / 2
Регистрация: 02.04.2016
Сообщений: 22
1

Считывание части строк из файла в кодировке CP866

02.04.2016, 20:27. Просмотров 328. Ответов 2

Доброго времени суток!
Пытаюсь считать из текстового файла в кодировке CP866 текст длинной например в 64 символа с начала каждой строки, запихнуть его в массив, размещённый в динамической памяти.
Условия:
использовать для чтения ifstream, для хранения char
Получилось вот это
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
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <fstream>
 
using namespace std;
const int LINE_SIZE=65;
 
int main(int argc, char** argv) {
    setlocale (LC_ALL, "CP866");
    
    ifstream f("test.txt"); //текст содержащий до 10 тыс строк и строки не длиннее 256 символов
if(!f){
        return 1;
    }
    char **t = new char *[10000];
    char temp[256];
    int i=0;
    int slen;   
    while(!f.eof()){
        t[i]= new char[LINE_SIZE];
        if(!f.getline(temp,256)){ 
            cout<<temp<<"oshibka\n";
            return 1;
        }
        slen=strlen(temp);
        if(slen<LINE_SIZE){
            t[i]=temp;
        }else{
            for(int j=0;j<LINE_SIZE;j++){
                t[i][j]=temp[j];
            }
        }
        i++;
    }
    f.close();
    for(int j=0;j<i;j++) {
        cout<<t[j]<<"\n";
        Sleep(1);
    }
    return 0;
}

Не по теме:

первоначально хотел сделать чтото вроде f.getline(t[i],LINE_SIZE), но оказалось что getline считав n-ое количество символов и не встретив завершающий символ, выпадает в ошибку (failbit). Зачем это нужно, загадка. В java и c# такого колдунства не наблюдал.


С текстовым файлом содержащим латиницу и цифры всё работает на ура. Но например с тектовым файлом содержащим чтото типа такого (текст в CP866)
Код
абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789
абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст012345678923456789иклмнопрст0123456789

абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789
абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789
абвгдеёжз0123456789иклмнопрст0123456789абвгдеёжз0123456789иклмнопрст0123456789а89
выпадает сразу в ошибку на getline.
ЧЯДНТ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2016, 20:27
Ответы с готовыми решениями:

Считывание из файла в нужной кодировке
Почему при считывание файла выдает кракозябры ? Содержимое файла: char *text; ifstream...

Считывание строк из файла
Здравствуйте, подскажите, пожалуйста, как организовать чтение строк из файла при помощи...

Считывание строк из файла
При считывании из файла читаются всего 3 строки. void rab::xinputfile() // vvod iz...

Считывание строк из файла
Во общем есть текстовый файл, из которого надо взять строку и просто ее напечатать #define...

Считывание строк из файла
Помогите, пожалуйста, нужно на завтра две прграммы написать, но не получается(( 1) считать из...

2
zss
Модератор
Эксперт С++
7919 / 7109 / 4444
Регистрация: 18.12.2011
Сообщений: 18,782
Завершенные тесты: 1
02.04.2016, 20:31 2
C++
1
#include <windows.h>
C++
1
2
3
4
5
if(!f.getline(temp,256)){ 
            cout<<temp<<"oshibka\n";
            return 1;
        }
       OemToChar(temp,temp);
0
Ataraveski
1 / 1 / 2
Регистрация: 02.04.2016
Сообщений: 22
03.04.2016, 00:05  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
OemToChar(temp,temp);
до исполнения не доходит, т.к. выпадает в ошибку ещё на getline

Добавлено через 3 минуты
добавил перехват исключений и все заработало
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
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <fstream>
 
using namespace std;
const int LINE_SIZE=65;
 
int main(int argc, char** argv) {
    setlocale (LC_ALL, "CP866");
    
    ifstream f("test.txt");
    if(!f){
        return 1;
    }
    cout<<"start\n";
    char **t = new char *[10000];
    char temp[256];
    int i=0;
    int slen;
f.exceptions(ifstream::failbit | ifstream::badbit | ifstream::eofbit); //все возможные исключения для getline
    try{
     while(!f.eof()){
        t[i]= new char[LINE_SIZE];
        f.getline(temp,256);
        slen=strlen(temp);
        if(slen<LINE_SIZE){
            t[i]=temp;
        }else{
            for(int j=0;j<LINE_SIZE;j++){
                t[i][j]=temp[j];
            }
        }
        i++;
    }
}catch (ifstream::failure e) {
    cerr << "Oshibka raboti s failom\n";
}
    f.close();
    for(int j=0;j<i;j++) {
        cout<<t[j]<<"\n";
        Sleep(1);
    }
    return 0;
}
Абсолютно не представляю почему. Ошибки при таком коде просто нет, и текст выводится в консоль. Очень странно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2016, 00:05

Считывание из файла строк с getline()
Код из интернета, который работает у автора, но не у меня. Ошибка: Call to undefined function...

Считывание строк из текстового файла
Доброго времени суток! Дана задача: Подготовить файл со списком из 20 сотрудников (в каждой...

Считывание из файла массива строк
Ув. товарищи! Помогите плз. Нужно реализовать функцию, заполняющую из файла массив строк. Что то...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru