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

Работа с текстовым файлом. Не могу понять - C++

Восстановить пароль Регистрация
 
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 17:26     Работа с текстовым файлом. Не могу понять #1
У меня такая ошибка. Я создал текстовый файл, там допустим 10 раз написано слово Hello.
Теперь я написал нижеследующий код, чтобы изменить определённые на слово World, допустим первый, шестой, К-тый (введённый с клавиатуры) и последний.
Всё получается, слова все меняются, но почему то добавляется ещё одно слово hello. Если в тексте было 10 слов Hello, то после исполнения программы становится 11 слов.
В чём проблема?
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 ()
{  ifstream f("hw6file.txt");
  string a[100];
  string s;
 getline (cin,s);
 int i=0, k;
 cin >>k;
 
 while (true)
 {if (!f.eof()) 
  {f>>a[i];i++;}
 else
   break;} 
 a[0]=s;
 a[5]=s;
 a[k]=s;   
 a[i]=s;
 
 ofstream g("hw6file.txt");
 int j=0;
 while (j<=i)
{g<<a[j]<< "  ";j++;}
 
return 0;}
 Комментарий модератора 
Используйте тег вставки кода С++.
Устное предупреждение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2012, 17:26     Работа с текстовым файлом. Не могу понять
Посмотрите здесь:

работа с текстовым файлом C++
Работа с текстовым файлом C++
C++ Работа с текстовым файлом
C++ Работа с текстовым файлом
C++ Работа с текстовым файлом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
08.11.2012, 17:38     Работа с текстовым файлом. Не могу понять #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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{ 
ifstream f("hw6file.txt");
string a[100];
string s;
getline (cin,s);
int i=0, k;
cin >>k;
 
 
while(f >> a[i++]);
 
a[0]=s;
a[5]=s;
a[k]=s; 
a[i]=s;
 
ofstream g("hw6file.txt");
int j=0;
while (j<=i)
{g<<a[j]<< " ";j++;}
 
return 0;}
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 17:48  [ТС]     Работа с текстовым файлом. Не могу понять #3
Цитата Сообщение от David Sylva Посмотреть сообщение
Не совсем правильно, считываешь файл, подправил
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{ 
ifstream f("hw6file.txt");
string a[100];
string s;
getline (cin,s);
int i=0, k;
cin >>k;
 
 
while(f >> a[i++]);
 
a[0]=s;
a[5]=s;
a[k]=s; 
a[i]=s;
 
ofstream g("hw6file.txt");
int j=0;
while (j<=i)
{g<<a[j]<< " ";j++;}
 
return 0;}
Та же самая ошибка, в файле записаны 10 слов изначально, а после исполнения программы становится 11 слов. В чём может быть ошибка помогите пожалуйста?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
08.11.2012, 18:00     Работа с текстовым файлом. Не могу понять #4
Цитата Сообщение от Parilo Посмотреть сообщение
Та же самая ошибка, в файле записаны 10 слов изначально, а после исполнения программы становится 11 слов. В чём может быть ошибка помогите пожалуйста?
только сейчас внимательно посмотрел, надо 24 строка while( j < i)
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 19:08  [ТС]     Работа с текстовым файлом. Не могу понять #5
Цитата Сообщение от David Sylva Посмотреть сообщение
только сейчас внимательно посмотрел, надо 24 строка while( j < i)
Да, теперь он не увеличивает количество слов, но зато не меняет последнее слово. Если же я ставлю в 20 строке a[i-1]=s; то он меняет, но снова выкидывает 11 слов вместо 10.
Что то тут кажется в другом проблема. Но в чём?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
08.11.2012, 19:21     Работа с текстовым файлом. Не могу понять #6
20 строка a[i-2]
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 19:30  [ТС]     Работа с текстовым файлом. Не могу понять #7
Цитата Сообщение от Parilo Посмотреть сообщение
Да, теперь он не увеличивает количество слов, но зато не меняет последнее слово. Если же я ставлю в 20 строке a[i-1]=s; то он меняет, но снова выкидывает 11 слов вместо 10.
Что то тут кажется в другом проблема. Но в чём?

Если есть возможность спросить у профессиональных программистов, спросите пожалуйста, а то у меня не у кого спросить, кроме как на этом форуме.
Заранее спасибо.

Добавлено через 3 минуты
Цитата Сообщение от David Sylva Посмотреть сообщение
20 строка a[i-2]

Спасибо большое, но честно говоря совсем не понял почему программа именно так работает. Вы понимаете? Не могли бы объяснить? А то получается методом тыка.
Спасибо.

Добавлено через 4 минуты
Цитата Сообщение от Parilo Посмотреть сообщение
Если есть возможность спросить у профессиональных программистов, спросите пожалуйста, а то у меня не у кого спросить, кроме как на этом форуме.
Заранее спасибо.

Добавлено через 3 минуты



Спасибо большое, но честно говоря совсем не понял почему программа именно так работает. Вы понимаете? Не могли бы объяснить? А то получается методом тыка.
Спасибо.


Аааа... я понял, он пробел считает за символ и когда считает i++, он считает пробелы тоже и последние 2 пробела нужно поэтому отнимать, правильно? Хотя.... я пробел то передаю в j, а не i, чо то совсем запутался...
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
08.11.2012, 19:33     Работа с текстовым файлом. Не могу понять #8
Попробуй так

C++
1
2
3
4
5
6
7
while(f >> a[i]) 
    ++i;
 
a[0]=s;
a[5]=s;
a[k]=s; 
a[i-1]=s;
Понял?
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 19:53  [ТС]     Работа с текстовым файлом. Не могу понять #9
Цитата Сообщение от Parilo Посмотреть сообщение
Если есть возможность спросить у профессиональных программистов, спросите пожалуйста, а то у меня не у кого спросить, кроме как на этом форуме.
Заранее спасибо.

Добавлено через 3 минуты



Спасибо большое, но честно говоря совсем не понял почему программа именно так работает. Вы понимаете? Не могли бы объяснить? А то получается методом тыка.
Спасибо.

Добавлено через 4 минуты




Аааа... я понял, он пробел считает за символ и когда считает i++, он считает пробелы тоже и последние 2 пробела нужно поэтому отнимать, правильно? Хотя.... я пробел то передаю в j, а не i, чо то совсем запутался...
А вот теперь смотрите ФОКУС.
Я должен точно такую же программу но только с файлом где записаны не слова, а числа. И чтобы он работал, я в 19 строке пишу while (j<i-1), хотя в программе со словами пишу просто j<i. В чём тут разница не пойму?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1. #include <iostream>
2. #include <fstream>
3. using namespace std;
4. int main ()
5. { ifstream f("hw5file.txt");
6. int a[100];
7. int k,x;
8. cin >> k >>x;
9. int i=0;
10. 
11.while (f >> a[i++]);
12.  a[0]=x;
13.  a[4]=x;
14.  a[k]=x; 
15.  a[i-2]=x;
16.
17. ofstream g("hw5file.txt");
18. int j=0;
19. while (j<i-1)
20. { g<<a[j]<< endl; j++;}
21. return 0;}
 Комментарий модератора 
Используйте тег вставки кода С++.
Устное предупреждение.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
08.11.2012, 19:55     Работа с текстовым файлом. Не могу понять #10
Цитата Сообщение от Parilo Посмотреть сообщение
.while (f >> a[i++]);
он увеличивает счётчик на один, уже после того как считал все файлы, потому что i++
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 20:01  [ТС]     Работа с текстовым файлом. Не могу понять #11
Цитата Сообщение от David Sylva Посмотреть сообщение
Попробуй так

C++
1
2
3
4
5
6
7
while(f >> a[i]) 
    ++i;
 
a[0]=s;
a[5]=s;
a[k]=s; 
a[i-1]=s;
Понял?
Программирование методом тыка, это не программирование, я могу попробовать разными способами. Я хотел бы понять почему именно так программа работает и понимает.

Добавлено через 3 минуты
Цитата Сообщение от Parilo Посмотреть сообщение
А вот теперь смотрите ФОКУС.
Я должен точно такую же программу но только с файлом где записаны не слова, а числа. И чтобы он работал, я в 19 строке пишу while (j<i-1), хотя в программе со словами пишу просто j<i. В чём тут разница не пойму?

1. #include <iostream>
2. #include <fstream>
3. using namespace std;
4. int main ()
5. { ifstream f("hw5file.txt");
6. int a[100];
7. int k,x;
8. cin >> k >>x;
9. int i=0;
10.
11.while (f >> a[i++]);
12. a[0]=x;
13. a[4]=x;
14. a[k]=x;
15. a[i-2]=x;
16.
17. ofstream g("hw5file.txt");
18. int j=0;
19. while (j<i-1)
20. { g<<a[j]<< endl; j++;}
21. return 0;}
Тогда объясните в чём разница файла со словами и файла с числами? Почему со словами чтобы программа работала я пишу while (j<i), а при работе с числами должен писать while (j<i-1)?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
08.11.2012, 20:14     Работа с текстовым файлом. Не могу понять #12
Никакой разницы нет.

если так, while(f >> a[i++]), то надо писать a[i-2], потому что i увеличился на 1 относительно размера.
если так while( f >> a[i])
++i;
всё нормально пишем так a[i-1]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2012, 20:24     Работа с текстовым файлом. Не могу понять
Еще ссылки по теме:

C++ работа с текстовым файлом
C++ Работа с текстовым файлом
C++ Работа с текстовым файлом

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

Или воспользуйтесь поиском по форуму:
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
08.11.2012, 20:24  [ТС]     Работа с текстовым файлом. Не могу понять #13
Цитата Сообщение от David Sylva Посмотреть сообщение
Никакой разницы нет.

если так, while(f >> a[i++]), то надо писать a[i-2], потому что i увеличился на 1 относительно размера.
если так while( f >> a[i])
++i;
всё нормально пишем так a[i-1]

Вы меня не поняли? Я не спрашиваю разницу между i++ и ++i, я спрашиваю разницу между абсолютно идентичными программами, в одном случае работа со словами, в другом с числами, и при использовании в обеих случаях while(f >> a[i++]) , j приходится приравнивать к i по разному, в одном случае while (j<i), во втором while (j<i-1).Я создал на этот счёт отдельную тему. Посмотрите и ответьте там если поняли.
Yandex
Объявления
08.11.2012, 20:24     Работа с текстовым файлом. Не могу понять
Ответ Создать тему
Опции темы

Текущее время: 05:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru