powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перезапись строки в файле.
10 сообщений из 10, страница 1 из 1
Перезапись строки в файле.
    #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
Перезапись строки в файле.
    #38898524
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rasrow,

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

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

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

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

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

чтобы переписать одну строку необходимо читать исходный файл построчно, и записывать его в выходной файл, а когда встретится нужная строка, заменить ее новой версией этой строки.
...
Рейтинг: 0 / 0
Перезапись строки в файле.
    #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
Перезапись строки в файле.
    #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
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перезапись строки в файле.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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