3 / 12 / 0
Регистрация: 26.10.2018
Сообщений: 167
1

Сделать решение без доп файла (я сделал с доп)

05.02.2020, 16:24. Показов 2646. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан символьный файл. Сократить число пробелов между словами до одного.
я сделал но с копированием во 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
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    string s;
    while (getline(fin, s)) //Пробегаем по строкам файла
    {
        for (int j = 0; j < s.length(); j++) //Обрабатываем каждую строку
        {
            if (s[j] == ' ')
            {
                while (s[j + 1] == ' ')
                    s.erase(j + 1, 1); //Удаляем лишние пробелы
            }
        }
        if (s[0] == ' ')
            s.erase(0, 1); //Удаляем пробел в начале строки
        if (s[s.length() - 1] == ' ')
            s.erase(s.length() - 1, 1); //Удаляем пробел в конце строки
        fout << s << endl; //Выводим обработанные строки
    }
    fin.close();
    fout.close();
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2020, 16:24
Ответы с готовыми решениями:

отсортировать двумерный массив по строкам без доп массивов
Подскажите плз как отсортировать массив двумерный по строкам, не используя доп массивов (как я...

Повторно запустить оператор switch без goto, циклов и доп. функций
Как сабж? int intSum = 0; int main(void) { int intInteger01, intInteger02; int intSwitch;...

Функции из доп.файла не связываются с основными
Приветствую, функции read и showing, не связываются между основным файлом и дополнительным файлом....

Можно ли сделать этот код без использования @ и доп функции aux
Доброго времени суток!) Есть такой вопрос, можно ли сделать этот код без использования @ и доп...

14
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
05.02.2020, 16:53 2
Цитата Сообщение от Бодрый666 Посмотреть сообщение
Дан символьный файл. Сократить число пробелов между словами до одного.
я сделал но с копированием во 2 файл, надо без доп файла в исходном.
Тебе надо считать все строки из файла в массив, std::vector<std::string> или std::list<std::string>, обработать их, и сохранить поверх исходного.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
05.02.2020, 17:23 3
Бодрый666, прочитали файл в строку:
C++
1
2
string s;
getline(fin, s, '\0');
удалили из строки лишние пробелы:
C++
1
2
3
size_t pos;
while ((pos = s.find("  ")) != string::npos)
        s = s.replace(pos, 2, " ");
записали строку в файл:
C++
1
fout << s;
1
3958 / 2501 / 420
Регистрация: 09.09.2017
Сообщений: 10,994
05.02.2020, 17:25 4
Лучший ответ Сообщение было отмечено Бодрый666 как решение

Решение

oleg-m1973, ужас какой! Вот так точно делать не надо. А вдруг файл на 2 ТБ?!
Цитата Сообщение от Бодрый666 Посмотреть сообщение
Дан символьный файл. Сократить число пробелов между словами до одного.
Например, так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <unistd.h>
  
int main(){
  FILE *fin, *fout;
  char str[1000];
  fin = fopen("file.txt", "rt+");
  if(fin == NULL){fprintf(stderr, "Can not open file\n"); return 0;}
  fout = fopen("file.txt", "rt+");
  if(fout == NULL){fprintf(stderr, "Can not open file\n"); fclose(fin); return 0;}
  fseek(fout, 0, SEEK_SET);
  while(1){
    if(fscanf(fin, "%s", str) == EOF)break;
    fprintf(fout, "%s ", str);
  }
  fclose(fin);
  size_t size = ftell(fout);
  if(size > 0)size--; //парой строчек выше мы добавили к каждой строке пробел. Вот его и убираем
  fclose(fout);
  truncate("file.txt", size);
}
Код
$ echo "aaa bbb      ddd" > file.txt
$ cat file.txt 
aaa bbb      ddd
$ ./a.out 
$ cat file.txt 
aaa bbb ddd
Правда, мой вариант съедает вообще все пробельные символы, то есть еще и табуляции, переводы строки и прочие.
1
3 / 12 / 0
Регистрация: 26.10.2018
Сообщений: 167
05.02.2020, 19:00  [ТС] 5
COKPOWEHEU, чем можно заменить truncate в c++?
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
05.02.2020, 19:07 6
Цитата Сообщение от Бодрый666 Посмотреть сообщение
чем можно заменить truncate в c++?
Я погуглил за вас: resize_file
1
3 / 12 / 0
Регистрация: 26.10.2018
Сообщений: 167
05.02.2020, 19:15  [ТС] 7
valen10, я почитал , но он почему то пишет идентификатор этой функции не найден.
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
#include <cstdlib>
#include <iostream>
#include <filesystem>
#include <iomanip>
#include <fstream>
int main(){
    FILE *fin, *fout;
    char str[1000];
    fin = fopen("input.txt", "rt+");
    if (fin == NULL){ fprintf(stderr, "Can not open file\n"); return 0; }
    fout = fopen("input.txt", "rt+");
    if (fout == NULL){ fprintf(stderr, "Can not open file\n"); fclose(fin); return 0; }
    fseek(fout, 0, SEEK_SET);
    while (1){
        if (fscanf(fin, "%s", str) == EOF)break;
        fprintf(fout, "%s ", str);
    }
    fclose(fin);
    size_t size = ftell(fout);
    if (size > 0)size--; //парой строчек выше мы добавили к каждой строке пробел. Вот его и убираем
    fclose(fout);
    resize_file("input.txt", size);
    //truncate("input.txt", size);
    system("pause");
    return 0;
}
0
3958 / 2501 / 420
Регистрация: 09.09.2017
Сообщений: 10,994
05.02.2020, 19:58 8
Цитата Сообщение от Бодрый666 Посмотреть сообщение
COKPOWEHEU, чем можно заменить truncate в c++?
А чем вас truncate не устроил? Может unistd.h подключить забыли?
0
3 / 12 / 0
Регистрация: 26.10.2018
Сообщений: 167
05.02.2020, 20:25  [ТС] 9
COKPOWEHEU, не подключается у меня

Добавлено через 54 секунды
COKPOWEHEU, 2 IntelliSense: не удается открыть источник файл "unistd.h"
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
05.02.2020, 20:50 10
Цитата Сообщение от Бодрый666 Посмотреть сообщение
пишет идентификатор этой функции не найден.
Пространства имён забыли. А еще стандарт C++17 и, возможно, библиотеку fs подключить придется. См. раздел Notes.
C++
1
std::filesystem::resize_file("input.txt", size);
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Может unistd.h подключить забыли?
unistd.h не кроссплатформенная же вроде. Если у ТС Windows и он использует не Cygwin или MinGW, то получится ли?
1
3 / 12 / 0
Регистрация: 26.10.2018
Сообщений: 167
05.02.2020, 21:02  [ТС] 11
valen10,пишет что после :: должен быть класс
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 <cstdlib>
#include <iostream>
#include <filesystem>
//#include <unistd.h>
#include <fstream>
using namespace std;
int main(){
    FILE *fin, *fout;
    char str[1000];
    fin = fopen("input.txt", "rt+");
    if (fin == NULL){ fprintf(stderr, "Can not open file\n"); return 0; }
    fout = fopen("input.txt", "rt+");
    if (fout == NULL){ fprintf(stderr, "Can not open file\n"); fclose(fin); return 0; }
    fseek(fout, 0, SEEK_SET);
    while (1){
        if (fscanf(fin, "%s", str) == EOF)break;
        fprintf(fout, "%s ", str);
    }
    fclose(fin);
    size_t size = ftell(fout);
    if (size > 0)size--; //парой строчек выше мы добавили к каждой строке пробел. Вот его и убираем
    fclose(fout);
    std::filesystem::resize_file("input.txt", size);
 
    //truncate("input.txt", size);
    system("pause");
    return 0;
}
Добавлено через 4 минуты
valen10, в кодблоксе работает.
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
05.02.2020, 21:13 12
Цитата Сообщение от Бодрый666 Посмотреть сообщение
в кодблоксе работает
Там скорее всего и unistd.h имеется. Компилятор какой используете?
0
3 / 12 / 0
Регистрация: 26.10.2018
Сообщений: 167
05.02.2020, 21:17  [ТС] 13
valen10, gcc вроде

Добавлено через 20 секунд
valen10, или mingw

Добавлено через 54 секунды
valen10, а как выглядит в c++ символьный файл, я просто только начал изучать его, это получается бинарный файл?
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
05.02.2020, 21:20 14
Бодрый666, как обычный txt. бинарный так и называется бинарный файл
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
05.02.2020, 21:54 15
Символьный файл выглядит как бинарный файл. Только символьный.
0
05.02.2020, 21:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2020, 21:54
Помогаю со студенческими работами здесь

Разгон без доп. питания
Возможно ли безопасно (хотя бы немного) разогнать видеокарту без доп. питания? (Green Edition,...

Видеокарты -с- и -без- доп. питания
Обязательно ли покупать видюху 1050 ti с доп. питанием или нет? Могут ли быть каке то проблемы без...

Отличие видеокарт с доп питанием и без него
Чем отличается видеокарта geforce 1050 с дополнительным питанием, от geforce 1050 без...

Msi 970a-g45 и gtx1050 без доп питания
Собственно имеется msi 970a-g45 и gtx1050 без доп питания , при запуске грузится до B2 и виснет ,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru