Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Galenus
0 / 0 / 1
Регистрация: 18.12.2016
Сообщений: 19
#1

Неправильное чтение файла

18.12.2016, 16:34. Просмотров 922. Ответов 2

Пишу программу, которая шифрует текст шифром Цезаря из файла и записывает его в этот же или в другой файл. Проблема: файл существует и проверку reading.is_open() проходит, но его значение при отладке в VS2015 равно ({_Filebuffer={_Pcvt=0x00000000 <NULL> _Mychar=0 '\0' _Wrotesome=false ...} }) и когда пытаю считать из него строку она получается пустой, хотя в файле есть данные. Что бы не нагромождать кода напишу только фун-ию в которой происходит ошибка:
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
void crypting(int type_c, int key_c, string alphabet_c, string path_in, string path_out)//шифрует алфавит и строку и записывает последнюю в файл
{
 
    string shift_al=alphabet_c;//дополнительный алфавит
    if (type_c == 1)// если зашифровываем
    {
        for (int i = 0; i<=alphabet_c.length() - 1; i++)
        {
            shift_al[i] = alphabet_c[(i + key_c + alphabet_c.length()) % (alphabet_c.length())];
        }
    }
 
    else
        if (type_c == 0)//если расшифровываем
        {
            for (int i = 0; i<=alphabet_c.length(); i++)
            {
                shift_al[i] = alphabet_c[(i - key_c + alphabet_c.length()) % alphabet_c.length()];
            }
        }
    /*path_in и path_out равны друг другу и имеют значение "D:\\_Project_C\\_Projects\\Lab3\\my.txt" 
    при отладке в VS2015 и D:\_Project_C\_Projects\Lab3\my.txt при вводе этого параметра в консоли*/
 
    ifstream reading(path_in.c_str());//открываем файл для чтения
    ofstream writing(path_in.c_str());//открываем файл для записи
        string line;
    while (!reading.eof())
    {
        getline(reading,line);// возвращает пустую строку, хотя не должен,т.к. файл содержит несколько строк текста
        for (int i = 0; i<line.length(); i++)// по-символьно переписывает строку
        {
            int buff;//будет хранить значение индекса найденной буквы
            buff = alphabet_c.find(line[i]);
            line[i] = shift_al[buff];
            cout << i << " " << buff << endl;
        }
        writing<<line<<endl;
    }
    reading.close();
    writing.close();    
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2016, 16:34
Ответы с готовыми решениями:

Неправильное чтение из файла
Имеется файл, в нем записано что-то вроде {1 2 3}{2 1 3}{3 1 2} Моя задача...

Неправильное чтение бинарного файла
программа должна по идее вывести 99.. мне так казалось.. #include &lt;iostream&gt;...

Неправильное удаление строки из файла
Здраствуйте! Относительно недавно изучаю C++, и знакомлюсь с работой с файлами....

Переделать в коде чтение из файла в чтение с клавиатуры
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен...

Чтение из файла. Повторное чтение файла
Добрый день. Необходимо реализовать в программе функцию повторного чтения...

2
zss
Модератор
Эксперт С++
7081 / 6616 / 4190
Регистрация: 18.12.2011
Сообщений: 17,446
Завершенные тесты: 1
18.12.2016, 17:01 #2
Лучший ответ Сообщение было отмечено Galenus как решение

Решение

Цитата Сообщение от Galenus Посмотреть сообщение
C++
1
2
ifstream reading(path_in.c_str());//открываем файл для чтения 
ofstream writing(path_in.c_str());//открываем файл для записи
Нельзя один и тот же файл открыть двумя потоками сразу.
Если действительно нужно, то используйте fstream
1
Galenus
0 / 0 / 1
Регистрация: 18.12.2016
Сообщений: 19
18.12.2016, 21:03  [ТС] #3
Да, вы были правы, дело было в одновременном открытии файла в 2х потоках. Долго пытался придумать как создать массив с заранее не определённым кол-во элт-ов, т.к. даже динамический массив требует объявления кол-ва переменных, а потом вспомнил, что есть векторы и всё заработало.
Конечный вид функции шифрования:
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
void crypting(int type_c, int key_c, string alphabet_c, string path_in, string path_out)//шифрует алфавит и строку и записывает последнюю в файл
{
 
    string shift_al=alphabet_c;//дополнительный алфавит
    if (type_c == 1)// если зашифровываем
    {
        for (int i = 0; i<=alphabet_c.length() - 1; i++)
        {
            shift_al[i] = alphabet_c[(i + key_c + alphabet_c.length()) % (alphabet_c.length())];
        }
    }
 
    else
        if (type_c == 0)//если расшифровываем
        {
            for (int i = 0; i<=alphabet_c.length(); i++)
            {
                shift_al[i] = alphabet_c[(i - key_c + alphabet_c.length()) % alphabet_c.length()];
            }
        }
 
    ifstream reading(path_in.c_str());//открываем файл для чтения
    int j=0;// счётчик кол-ва строк в файле
    vector <string> allLines;// Вектор нам понадобится как массив с бесконечной и заранее неопределённой длинной
 
    while (!reading.eof())
    {
        string line;
        getline(reading,line);// возвращает пустую строку, хотя не должен,т.к. файл содердит несколько строк текста
        for (int i = 0; i<line.length(); i++)
        {
            int buff;//будет хранить значение индекса найденной буквы
            buff = alphabet_c.find(line[i]);
            line[i] = shift_al[buff];
        }
        allLines.push_back(line);// запись за/расшифрованной строки в конец вектора
        j++;
    }
    reading.close();
 
    ofstream writing(path_in.c_str());//открываем файл для записи
    for (int i(0); i <j; i++)
    {
        writing << allLines[i] << endl;//переносим строки из вектора в файл
    }
    writing.close();    
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2016, 21:03

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt;...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них...


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

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

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