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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

fstream не записывает данные в файл - C++

11.10.2013, 03:48. Просмотров 2171. Ответов 7
Метки нет (Все метки)

Если к примеру открываю файл так :
C++
1
2
fstream io;
io.open("test.txt");
то читает из файла хорошо, если при этом не записывать ничего. Скажем есть цикл и в нем getline извлекает строку, потом строка модифицируется остальным кодом и записывается обратно в тот же файл и на тоже место. Так вот такая запись все ломает и в файл ничего не записывается и читает только 60 строчек из 1000, а если убрать запись, то все читается снова же нормально. Но если писать в тот же файл на то же место, но с другим объектом, то все ок. Вот так к примеру :
C++
1
2
3
4
fstream io
fstream io2;
io.open("test.txt");
io.open("test.txt");
В чем же проблема?
Знаю про ifstream и ofstream, но хочу fstream.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2013, 03:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос fstream не записывает данные в файл (C++):

Как записать в файл данные, используя объекты fstream? - C++
Самый простой способ реализации, пожалуйста. К примеру, что надо изменить в этой части кода, чтобы она работала как надо? То есть:...

Программа не записывает данные в файл - C++
Программа не записывает данные в файл помогите исправить #include<iostream> #include <stdio.h> #include <stdlib.h> ...

Не записывает новые данные в файл телефонный справочник - C++
Пишу программу телефонный справочник с возможностью добавлять абонента через консоль, в консоле абонент добавляться нормально но когда...

Почему не записывает в файл данные? Файловый вывод. - C++
Help!!!!!!! привет всем! консольное приложение С++(компилятор BC++ 6.0) тема работы поиск всех вхождений подстроки в строку по маске...

Один поток записывает данные в файл, другой читает - C++
Написать код на С++ или С# или на Java Создать два потока. Первый поток производит запись в файл случайных данных. Второй производит...

Записывает в указанный файл данные, находящиеся в двумерном массиве дробного типа - C++
Напишите программу, которая записывает в указанный файл данные находящиеся в двумерном массиве дробного типа.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.10.2013, 05:42 #2
C++
1
fstream io("test.txt");
Система тут такая: чтобы перейти от чтения к записи, нужно или отсоединить файл от потока и опять соединить , или указать, через seekp, куда записывать. После записи, к чтению, можно сразу переходить (но не забыть очистить буфер (flush()), чтобы запись попала в файл).
И не забывать, при достижении конца файла, сбрасывать флаги потока, иначе поток нерабочий, и никакие действия с потоком не будут выполняться.
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
12.10.2013, 12:46  [ТС] #3
alsav22, А какие флаги, если я их не устанавливал?
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2013, 12:49 #4
Например, флаг eof. Установится при достижении конца файла.
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
12.10.2013, 14:04  [ТС] #5
alsav22, Все ровно не пойму как нужно сделать. Не могли бы вы на примере моего кода объяснить что в нем нужно изменить, чтобы он заработал правильно. Из кода все лишнее вырезал, вообщем вот
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{   
fstream io;
string str_file;
io.open("D:\\2.srt");
 
 
while(io)
{
    getline(io, str_file);
 
    static int ic = 0;
    cout << endl << ic++ << endl;
    str_file.push_back('\n');
    io.write(str_file.c_str(), str_file.size());
}
 
system("pause");
}
И вот файл 2.rar
Если закомментировать io.write , то все кажется работает нормально и 3992 раз входит в цикл, то есть равное количеству строк в файле, но а если оставить запись, то будет всего 232 вхождения в цикл. Наверное там ещё проблемы есть, которые вы объясняли, но что-то я не сообразил.
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2013, 14:53 #6
Если вы хотите считать строку, изменить её, и записать на то же место, то изменённая строка должна быть по размеру равна начальной. Если нет, то нужно записывать в другой файл.

Добавлено через 4 минуты
В файле нет строк в обычном понимании. Там коды символов идут подряд. Теперь подумайте, как при этом может происходить вставка.
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
12.10.2013, 15:54  [ТС] #7
Остальной код не модифицирует её в плане увеличения размера. Там просто циклом заменяются символы на другие, но не добавляются новые и тот код не важен в данный момент, потому что не работает именно эта часть что описал, так как мне не понятно из-за какой такой проблемы количество входов в цикл сокращается с 3992 до 232. Могли бы вы просто исправить код, который выше, чтобы он был рабочим, при этом не добавляя новый поток, а так как вы говорили с использованием flush seekp и сбросом флагов?
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2013, 17:02 #8
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{   
    fstream io;
    string str_file;
    io.open("D:\\2.srt");
    int i = 0;
    while(getline(io, str_file))
    {
        
        static int ic = 0;
        cout << endl << ic++ << endl;
        str_file.push_back('\n');
        io.seekp(i);
        io << str_file;
        //io.write(str_file.c_str(), str_file.size());
        i = io.tellg();
        io.flush();
    }
    io.close();
 
    system("pause");
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2013, 17:02
Привет! Вот еще темы с ответами:

Одна программа записывает данные в файл, а другая их считывает и выводит на экран - C++
Задача состоит в том чтоб одна программа записала данные в файл а другая их считала и вывела на экран как полагается, запись и считывание...

Не записывает данные в класс - C++
Добрый день. Учусь на 1 курсе, не ругайте если коряво. Мне задали задачку сделать класс Книжка с контактами, где должны вводиться фамилия,...

Fstream не видит файл - C++
Почему в Visual Studio2015 не находит текстовый файл, который лежит рядом с .exe? ifstream F; F.open(&quot;vacancy.txt&quot;); char...

Запись в файл fstream - C++
Вот такой вот код , изобразил я для записи переменной в файл , проблема в том , что компилятор записывает в него не 10 раз L , а ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2013, 17:02
Ответ Создать тему
Опции темы

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