Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перезапись строки в файле. / 10 сообщений из 10, страница 1 из 1
08.03.2015, 19:35
    #38898516
Rasrow
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
Я сделал программку, которая находит символ перед ";" и меняет на +1 (то есть было "2;" стало "3;"). Но столкнулся с проблемой.
Программа меняет значения, но не переписывает строку в файле. Я считаю, что ошибка связано с myfile<<s1; . Помогите мне решить эту проблему.


Код: plaintext
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.
#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>

using namespace std;

int main()
{
     {   
     int a,b,c;
     size_t length;
     char ch[100];
    string s1,s2;
    fstream myfile;
    myfile.open ("spisok.txt");
     if (myfile.is_open())
     {
    while ( myfile.good() )
     {
      getline (myfile,s1);
      cout << s1 << endl;

      a=s1.find(";");
      b=s1.length();
      c=s1.copy(ch,b,a-1);
      ch[c-2]=ch[c-2]+1;
      string str(ch);
      b=b-2;
      s1.replace(b,2,str);
      cout<<s1<<endl;
      myfile<<s1; //zdesj problema, esli ubratj to programma pokazivaet vse stroki, a ne odnu
     
     //
      ch[c-2]='\0';
      s1.clear();


     }
     myfile.close();
     
     }
    else cout << "Unable to open file";
     }  




    system("PAUSE");
    return EXIT_SUCCESS;
}
...
Рейтинг: 0 / 0
08.03.2015, 19:52
    #38898524
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
Rasrow,

Чтобы писать в файл, надо его открыть для записи.

Отформатируй код. На то что есть смотреть страшно и читать неприятно.

Дай переменным осмысленные имена.
...
Рейтинг: 0 / 0
08.03.2015, 20:45
    #38898547
Rasrow
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
fstream myfile; это же работа с файлом он может записывать и считывать.
и если делать, как ты советуешь то получается, что надо ofstream и ifstream прописывать, но тогда придется еще счетчик вводить,
чтобы он смог заменять определенную строчку.
...
Рейтинг: 0 / 0
08.03.2015, 22:41
    #38898584
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
Rasrow, неясно задание. Ответь на вопросы.

Если было "9;" то после замены будет "10;" или есть другие варианты?
Если перед символом ";" стоит нечисловой знак то как быть?
Как быть с цепочкой символов ";;;;;;;;" ?
...
Рейтинг: 0 / 0
08.03.2015, 22:50
    #38898586
Rasrow
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
Ну все условия будет потом, а так запланировано от 0-9, пока без проверок хочу сделать, главное чтобы работало так, хочу изменить строчку например 5, и она увеличивается на +1. А так потом можно проверку по символам если пробел то 1 символ от ;, а если нет то 2 символа. Эта программа рассчитано на работу с цифрами в списке.
...
Рейтинг: 0 / 0
08.03.2015, 22:52
    #38898587
Rasrow
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
Вот к примеру в файле будет:
1) A.Pushkin, "Skazka o zolotoj rybke", (2) 2;
2) F.Dostoevskij, "Idiot", (4) 4;
...
Рейтинг: 0 / 0
09.03.2015, 09:48
    #38898677
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
Rasrow,
отформатируй код (читать невозможно)
сформулируй постановку задачи (хотя бы на примере "было"-"стало").

Вы уверены, что "затираете" прежнюю строку? А то вытаскиваете строку по getline (текущая позиция в файле уехала "за неё"), что-то с ней делаете, а затем пытаетесь писать в текущую позицию в файле... которая уже не указывает на начало "подменяемой" строки!!! И да, изначальная строка и "затирающая" одной длины? Как думаете, что случится, если вдруг длиннее или короче?
...
Рейтинг: 0 / 0
09.03.2015, 12:15
    #38898732
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
на самом деле в текстовом файле невозможно вот так вот взять и переписать одну строку.
она может быть другой длины, и ее запись может просто стереть часть следующей строки. либо будет недозапись и часть старой строки останется в виде мусора.

чтобы переписать одну строку необходимо читать исходный файл построчно, и записывать его в выходной файл, а когда встретится нужная строка, заменить ее новой версией этой строки.
...
Рейтинг: 0 / 0
11.03.2015, 00:15
    #38900595
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
Вот пример, воспроизводящий попытку перезаписи файла in-place:
Код: plaintext
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.
#include <iostream>
#include <fstream>
#include <string>

int main ()                                                                                                                                           
{                                                                                                                                                     
  std::fstream fl("file.txt",std::fstream::in | std::fstream::out);                                                                                   
                                                                                                                                                      
  while( fl.good() )                                                                                                                                  
    {                                                                                                                                                 
      std::streampos line_start = fl.tellg();                                                                                                         
                                                                                                                                                      
      std::string ln;                                                                                                                                 
      std::getline( fl, ln );                                                                                                                         
                                                                                                                                                      
      size_t b = ln.find('<');                                                                                                                        
      size_t e = ln.find('>');                                                                                                                        
      if( b != std::string::npos && e != std::string::npos                                                                                            
          && b < e && e - b > 1 )                                                                                                                     
        {                                                                                                                                             
          std::string ln_new = ln.substr( 0, b + 1 )                                                                                                  
            + std::to_string( std::stoi( ln.substr( b+1, e-b-1 ) ) + 1 )                                                                              
            + ln.substr( e );                                                                                                                         
          ln = ln_new;                                                                                                                                
          fl.seekp( line_start );                                                                                                                     
          fl << ln_new << "\n";                                                                                                                       
                                                                                                                                                      
        }                                                                                                                                             
                                                                                                                                                      
      std::cout << ln << std::endl;                                                                                                                   
    }                                                                                                                                                 
  return 0;                                                                                                                                           
}



Вот файл с данными до работы программы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
This is text without tags.
<1> this is number one.
<9> this is number nine.
.<10> this is number ten.
<99> this is number ninety nine.
<> this is empty tag.
< this is text without tag (1)
> this is text without tag (2)

и после работы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
This is text without tags.
<2> this is number one.
<10> this is number nine.
<11> this is number ten.
<100> this is number ninety nine.
> this is empty tag.
< this is text without tag (1)
> this is text without tag (2)
(Заметьте, что пропал символ '.')

А вот содержимое консоли при работе (вывод в другой файл)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ziv@xozzo:~/x/cpp/text-file-overwrite$ cp ./file.txt.save ./file.txt && g++ -std=c++0x -o text-file-overwrite ./text-file-overwrite.cpp && ./text-file-overwrite 
This is text without tags.
<2> this is number one.
<10> this is number nine.
<11> this is number ten.
<100> this is number ninety nine.
> this is empty tag.
< this is text without tag (1)
> this is text without tag (2)
...
Рейтинг: 0 / 0
11.03.2015, 00:23
    #38900596
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезапись строки в файле.
А вот такой эта программа должна была бы быть:

Код: plaintext
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>

int main ()                                                                                                                                           
{                                                                                                                                                     
  std::fstream fl("file.txt",std::fstream::in | std::fstream::out);                                                                                   
  std::fstream o("file.out",std::fstream::out);                                                                                                       
                                                                                                                                                      
  while( fl.good() )                                                                                                                                  
    {                                                                                                                                                 
      std::string ln;                                                                                                                                 
      std::getline( fl, ln );                                                                                                                         
                                                                                                                                                      
      size_t b = ln.find('<');                                                                                                                        
      size_t e = ln.find('>');                                                                                                                        
      if( b != std::string::npos && e != std::string::npos                                                                                            
          && b < e && e - b > 1 )                                                                                                                     
        {                                                                                                                                             
          std::string ln_new = ln.substr( 0, b + 1 )                                                                                                  
            + std::to_string( std::stoi( ln.substr( b+1, e-b-1 ) ) + 1 )                                                                              
            + ln.substr( e );                                                                                                                         
          ln = ln_new;                                                                                                                                
        }                                                                                                                                             
      o << ln << "\n";                                                                                                                                
    }                                                                                                                                                 
  return 0;                                                                                                                                           
}



И результат её работы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
This is text without tags.
<2> this is number one.
<10> this is number nine.
.<11> this is number ten.
<100> this is number ninety nine.
<> this is empty tag.
< this is text without tag (1)
> this is text without tag (2)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перезапись строки в файле. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]