Ваш код имеет несколько логических и функциональных ошибок, которые мешают ему работать как задумано. Давайте рассмотрим их и предложим модификацию программы.
### Проблемы в коде:
1. **Неправильное чтение и запись**:
- Вы сначала считываете строку с помощью `getline(cin, msg);`, а затем записываете её в файл. Это не соответствует вашей задаче: вы хотите прочитать строку непосредственно из файла.
2. **Неправильная работа с указателем файла**:
- Использование `file.seekg(-1, ios::cur);` для возвращения указателя на один символ назад в процессе чтения может привести к неправильной работе, так как вы сменили режим файла с `fstream::in` на `fstream::out`.
3. **Несоответствующая логика обработки пробелов**:
- Вы не сможете менять `file` в режиме чтения, и методы записи не будут работать, как вы ожидаете.
4. **Отсутствие контроля за количеством пробелов**:
- Если в строке содержит несколько пробелов подряд, это может привести к появлению нежелательных пустых строк.
### Как исправить?
Мы будем работать с временным буфером для хранения изменений, прежде чем записывать их обратно в файл. Пример исправленного кода:
```cpp
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main() {
setlocale(LC_ALL, "ru");
string path = "myfile.txt";
fstream file(path, fstream::in | fstream::out | fstream::app);
if (!file.is_open()) {
cout << "Ошибка доступа к файлу" << endl;
return 1;
} else {
cout << "Файл открыт " << endl;
}
string line;
// Читаем содержимое файла
stringstream buffer;
while (getline(file, line)) {
buffer << line << '\n'; // Сохраняем в строковом потоке
}
file.clear(); // Очищаем флаги
file.seekp(0); // Возвращаемся в начало файла
// Обработка строки, замена пробелов на переносы строк
string output;
stringstream ss(buffer.str());
string word;
while (ss >> word) {
output += word + '\n'; // Добавляем слово и перенос строки
}
// Записываем результат обратно в файл
file << output;
file.close();
return 0;
}
```
### Объяснение исправлений:
1. **Чтение из файла**: Я считываю все содержимое файла в строковый поток (`stringstream`). Это позволяет нам легко манипулировать строками.
2. **Обработка пробелов**: Я использую `stringstream`, чтобы разбить строку на отдельные слова, удаляя лишние пробелы, а затем добавляю каждое слово с переносом строки.
3. **Запись в файл**: После обработки строк мы очищаем файл и записываем новый контент.
Попробуйте этот код, и он должен работать согласно вашим ожиданиям!