Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Чтение и сохранение файла .txt в С++

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Чтение и сохранение файла .txt в С++
Имя
Сообщение << Старые топики   Новые топики >>
Чтение и сохранение файла .txt в С++ - 2008-04-17 20:00:03.073333   
BeoWolf11

Сообщений: 76
Оценки: 0
Присоединился: 2008-01-31 21:09:43.920000
Вот я недавно начитл изучать STRING в С++. Но у меня такой вопрос: вот я написал прогу которая читает с файла .txt и делает там изминения…
 
quote:

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string.h&gt;
using namespace std;
int main()
{
&nbsp;&nbsp;&nbsp; fstream fin ("C:/data.txt");
&nbsp;&nbsp;&nbsp; const int LINE_LENGTH = 100;
&nbsp;&nbsp;&nbsp; char str[LINE_LENGTH];
&nbsp;&nbsp;&nbsp; string s;
&nbsp;&nbsp;&nbsp; while( fin.getline(str,LINE_LENGTH) )
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.append (" [Everyone gasps.]");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; s &lt;&lt; endl;
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; system("PAUSE");
&nbsp;&nbsp;&nbsp; return 0;
}

 
Как видите она читает с файла data.txt каторый находятся в C:/
В этом файле строки:
quote:

&nbsp; Fry: One Jillion dollars.
&nbsp; Auctioneer: Sir, that's not a number.

Так вотб прога добавляет в конец этих строк еще "[Everyone gasps.]". И после этого получяется
quote:

&nbsp; Fry: One Jillion dollars. [Everyone gasps.]
&nbsp; Auctioneer: Sir, that's not a number. [Everyone gasps.]

Но как можно зделать так, чтобы прога сама соханяла готовый результат в том же файле, или может быть в другом .txt
Post #: 1
RE: Чтение и сохранение файла .txt в С++ - 2008-04-17 20:09:41.663333   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
system((string("echo ") + s + string(" >>file.txt")).c_str());
Post #: 2
RE: Чтение и сохранение файла .txt в С++ - 2008-04-17 20:17:22.093333   
BeoWolf11

Сообщений: 76
Оценки: 0
Присоединился: 2008-01-31 21:09:43.920000
quote:

system((string("echo ") + s + string(" &gt;&gt;file.txt")).c_str());

В этом случае прога сохраняет только последнию строку "Auctioneer: Sir, that's not a number. [Everyone gasps.] "
Но мне нужно весь текст сохванить
Как это зделать?
Post #: 3
RE: Чтение и сохранение файла .txt в С++ - 2008-04-18 01:11:12.416666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
1. Читаешь построчно
2. Пишешь во временный файл модифицированную строку
3. Если не конец файла - делаешь п. 1
4. Удаляешь исходный файл
5. Переименовываешь новый

Absurd, ты извращенец ;)… +1
Post #: 4
RE: Чтение и сохранение файла .txt в С++ - 2008-04-18 08:08:55.930000   
BeoWolf11

Сообщений: 76
Оценки: 0
Присоединился: 2008-01-31 21:09:43.920000
А методом кода можешь показать :) Просто я не очень понемаю смысл твоих идей…
Post #: 5
RE: Чтение и сохранение файла .txt в С++ - 2008-04-18 22:23:04.300000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
 Да просто переписать файл он предлагает,что не понятного.А для этого надо в цикле "while( !feof(f) )" перечитать строчки: считал -изменил - записал.Потом 4,5 пункты. Absurd жжот…))
Post #: 6
RE: Чтение и сохранение файла .txt в С++ - 2008-04-19 00:53:12.003333   
BeoWolf11

Сообщений: 76
Оценки: 0
Присоединился: 2008-01-31 21:09:43.920000
Все, уже все нормально, спосибо…
Но я не понимаю прикол с Absurd-ом, ведь все нормально работает…
Post #: 7
RE: Чтение и сохранение файла .txt в С++ - 2008-04-19 04:52:37.496666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Решение Absurd'а платформозависимое. Ты попробуй под досом такое провернуть.
Post #: 8
RE: Чтение и сохранение файла .txt в С++ - 2008-04-19 13:29:57.196666   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
quote:


Решение Absurd'а платформозависимое. Ты попробуй под досом такое провернуть.


Под Линуксом работает, но там echo чувствительно к апостофу (')
Post #: 9
RE: Чтение и сохранение файла .txt в С++ - 2008-04-19 13:44:13.870000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: _SaZ_
Решение Absurd'а платформозависимое. Ты попробуй под досом такое провернуть.

А что, под досом нету функции system?
Post #: 10
RE: Чтение и сохранение файла .txt в С++ - 2008-04-19 14:03:47.770000   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666

quote:

ORIGINAL: rgo

quote:

ORIGINAL: _SaZ_
Решение Absurd'а платформозависимое. Ты попробуй под досом такое провернуть.

А что, под досом нету функции system?

На самом деле под дос нет компилятора который бы поддерживал современный С++ и в частности std::string.
Post #: 11
RE: Чтение и сохранение файла .txt в С++ - 2008-04-19 15:18:38.700000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Absurd
На самом деле под дос нет компилятора который бы поддерживал современный С++ и в частности std::string.

Насчёт "современный C++" – наверное, по-крайней, мере я не знаю (кстати, а OpenWatcom не умеет случаем?). Но std::string есть, скажем в BorlandC++. В версии 3.1 точно был, и был в 5.0, в версии которая тоже, если мне память не изменяет умел делать досовые программы.
Собственно я, когда-то давно, читая книжку про C++ и изучая C++, экспериментировал с BorlandC++. Наиболее заметное отклонение от книги, которое было в том C++'е – это неработоспособность try-throw-catch.
Post #: 12
RE: Чтение и сохранение файла .txt в С++ - 2008-04-20 00:55:03.733333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Хех. Не знал про system, т.к. юзал его только в таком контексте - system("cls");
Post #: 13
RE: Чтение и сохранение файла .txt в С++ - 2008-04-20 13:04:46.316666   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
quote:

ORIGINAL: rgo
quote:

ORIGINAL: Absurd
На самом деле под дос нет компилятора который бы поддерживал современный С++ и в частности std::string.

Насчёт "современный C++" – наверное, по-крайней, мере я не знаю (кстати, а OpenWatcom не умеет случаем?).

По поводу современного С++ под ДОС у меня наименьший скепсис вызывает gcc + djgpp.
Post #: 14
RE: Чтение и сохранение файла .txt в С++ - 2008-04-20 16:55:56.520000   
BeoWolf11

Сообщений: 76
Оценки: 0
Присоединился: 2008-01-31 21:09:43.920000
Вот у меня еще вопрос (задам здесь чтоб новую тему не открывать).
Написал я прогу… Вводишь с клавиатуры петь к файлу .txt и слово которое хочешь удалить. Прога должна удалить это слово (или вукву) отовсюду где ее найдет…
Допустим у нас есть фаил files.txt с содержанием:
macaca crossbow chitchat
Вот первый вариант:

quote:

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string.h&gt;
using namespace std;
int main()
{
&nbsp; string filename;
&nbsp; cout &lt;&lt; "Give the way to the file\n";
&nbsp; cout &lt;&lt; "For ex:&nbsp;&nbsp; C:/data.txt&nbsp;&nbsp; sau&nbsp;&nbsp;&nbsp; C:/data.doc\n";
&nbsp; getline (cin, filename);
&nbsp; ifstream fin( filename.c_str() );&nbsp;
&nbsp; if( !fin )
&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Error opening " &lt;&lt; filename &lt;&lt; endl;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system("PAUSE");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit (-1);
&nbsp; }
&nbsp; else
&nbsp; ifstream fin (filename.c_str());
&nbsp; string s, str;
&nbsp; int len, loc;
&nbsp; cout &lt;&lt; "What words do you wand to delete? " &lt;&lt; endl;
&nbsp; getline (cin, str);
&nbsp; len = str.length();
&nbsp; while(getline(fin,s) )
&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc = s.find(str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (loc == -1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "The word " &lt;&lt; str &lt;&lt; " couldnt be found in the text!" &lt;&lt; endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system("PAUSE");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit (-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "WAIT…" &lt;&lt; endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc = s.find (str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.erase (loc, len);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {system((string("echo ") + s + string(" &gt;&gt;data.txt")).c_str());}
&nbsp; }
&nbsp; system ((string ("gates.txt")).c_str());
&nbsp; return 0;
}


Допустим вводим путь к файлу и потом букву с (прога должна из всех слов удалить все буквы с) и прога должна сохранить это в файле data.txt который должен содержать:
maaa rossbow hithat Но в выше показанной проге, результат будет таким:
maaca rossbow hitchat Как вы видите, из всех строк, прога удаляет толь первую найденную букву с.
И я немного изменил код:
quote:

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string.h&gt;
using namespace std;
int main()
{
&nbsp; string filename;
&nbsp; cout &lt;&lt; "Give the way to the file\n";
&nbsp; cout &lt;&lt; "For ex:&nbsp;&nbsp; C:/data.txt&nbsp;&nbsp; sau&nbsp;&nbsp;&nbsp; C:/data.doc\n";
&nbsp; getline (cin, filename);
&nbsp; ifstream fin( filename.c_str() );&nbsp;
&nbsp; if( !fin )
&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Error opening " &lt;&lt; filename &lt;&lt; endl;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system("PAUSE");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit (-1);
&nbsp; }
&nbsp; else
&nbsp; ifstream fin (filename.c_str());
&nbsp; string s, str;
&nbsp; int len, loc;
&nbsp; cout &lt;&lt; "What word do you want to delete? " &lt;&lt; endl;
&nbsp; getline (cin, str);
&nbsp; len = str.length();
&nbsp; while(getline(fin,s) )
&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc = s.find(str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (loc == -1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "The word " &lt;&lt; str &lt;&lt; " couldnt be found in the text!" &lt;&lt; endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system("PAUSE");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit (-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "WAIT…" &lt;&lt; endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (loc != -1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc = s.find (str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.erase (loc, len);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {system((string("echo ") + s + string(" &gt;&gt;data.txt")).c_str());}
&nbsp; }}
&nbsp; return 0;
}

Теперь прога должна удалять все буквы с из всех строк…
Но результат получяется таким:
maaca maaa Т.е она удаляет все буквы с только из первой строки фаила, и сохраняет не только финальный результат, но все шаги т.е. если в нашем файле files.txt была бы только строка macaca то во втором случае (измененой проги) результат должен был быть только maaa но сохраняются все шаги…
Если в файле files.txt была строка macacamacacamacaca то результат был бы таким:
maacamacacamacaca maaamacacamacaca maaamaacamacaca maaamaaamacaca maaamaaamaaca maaamaaamaaa Но мне нужна только строка maaamaaamaaa Так вот, что еще нужно изменить чтоб прога удаляля все буквы с (если так вводим) из всех строк, и сохраняла только финальный результат, a не все шаги…
Post #: 15
RE: Чтение и сохранение файла .txt в С++ - 2008-04-21 00:37:40.760000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Нужно немножко подумать головой, и попробовать разные варианты. Начни с разработки чёткого алгоритма, что именно ты хочешь сделать. Не пытайся сразу кодить, от этого будут проблемы.
Post #: 16
RE: Чтение и сохранение файла .txt в С++ - 2008-04-21 18:23:04.143333   
BeoWolf11

Сообщений: 76
Оценки: 0
Присоединился: 2008-01-31 21:09:43.920000
quote:

Нужно немножко подумать головой, и попробовать разные варианты. Начни с разработки чёткого алгоритма, что именно ты хочешь сделать. Не пытайся сразу кодить, от этого будут проблемы.

 
Я уже достаточно подумал и много испробовал, и нашол проблему, только не знаю как ее решить…
quote:

ifstream fin ("C:/data.txt");
stirng s;
int loc;
while (getline(fin,s))
{
&nbsp;&nbsp;&nbsp; while (loc != -1)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc = s.find ("c");&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.erase (loc, 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ostream outputFile("C:/file.txt");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputFile &lt;&lt; s &lt;&lt; endl;
&nbsp;&nbsp;&nbsp; }
&nbsp;}

Функция s.find() ищет тоько в первой строке файла, как зделать так чтоб искал во всех строках?

Post #: 17
RE: Чтение и сохранение файла .txt в С++ - 2008-04-22 16:40:42.136666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
1. Ты не инициализируешь переменную loc. Это есть нехорошо.
2. Попробуй перед ним (2-ым циклом) вставить loc = 0; Получается, что когда в первой строке закончились нужные символы ты читаешь вторую, а переменная loc остаётся равной -1, и во вложенный цикл твоя программа даже не заходит.

P.S. А сколько тебе лет? Просто ты очень невнимательный (возможно из-за возраста) или очень упорно не хочешь думать перед тем, чтобы что-то писать и не думаешь в процессе написания. Попробуй читать свою программу и последовательно выполнять (можно на листике ;) то, что ты там написал. На первых порах будет тяжело, но потом привыкнешь. И когда будешь писать большие прогарммы таких ошибок допускать не будешь.
Post #: 18
RE: Чтение и сохранение файла .txt в С++ - 2008-04-22 20:05:59.750000   
BeoWolf11

Сообщений: 76
Оценки: 0
Присоединился: 2008-01-31 21:09:43.920000
quote:

Попробуй перед ним (2-ым циклом) вставить loc = 0; Получается, что когда в первой строке закончились нужные символы ты читаешь вторую, а переменная loc остаётся равной -1, и во вложенный цикл твоя программа даже не заходит.

Ты имеешь в виду так?
ifstream fin ("C:/files.txt"); string s; int loc; while (getline(fin,s)) { &nbsp;&nbsp;&nbsp;loc = 0; &nbsp;&nbsp; while (loc != -1) &nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc = s.find ("c");&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.erase (loc, 1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fstream outputFile("C:/filesss.txt", fstream::out); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputFile &lt;&lt; s &lt;&lt; endl; &nbsp;&nbsp; } } Если да, то не выходит…
 
quote:

P.S. А сколько тебе лет? Просто ты очень невнимательный (возможно из-за возраста) или очень упорно не хочешь думать перед тем, чтобы что-то писать и не думаешь в процессе написания.

Мне 15. Я просто перегружен, только неделю назад начил изучать string в С++, и слишком много информации сразу…
Но я не пытаюсь себя остановить… Тем более я хочу по быстрее изучить язык…
Post #: 19
RE: Чтение и сохранение файла .txt в С++ - 2008-04-23 05:13:07.540000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Советую. Изучи сначала C. Не пытайся сразу юзать STL. И попробуй пошагово прогнать с помощью отладчика. Сразу найдёшь ошибку.

P.S. Файл на запись лучше только один раз открывать, а не каждый раз в цикле.
Post #: 20
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Чтение и сохранение файла .txt в С++







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.