IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Файлы C++
сообщение
Сообщение #1


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Программа должна копировать содержимое одного файла в дркгой с удалением пробелов. Чтение буферизовано по 5 символов.
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
void main ()
{
ifstream vvod;
//Открыть файл для чтения
vvod.open ("source.txt",ios::in);

if (!vvod) //Ошибка?
{ cout<<endl<<"Не могу открыть source.txt для чтения!";
return;}

vvod.seekg (0,ios::beg); //Перейти в начало файла при чтении

char buffer[5];
int i;
ofstream vivod;
vivod.open("target.txt",ios::out|ios::trunc);
if (!vivod) //Ошибка?
{ cout<<endl<<"Не могу открыть target.txt для чтения!";
return;}
while (!vvod.eof()) {
vvod.read(buffer,1);
//for (i=0; i<20; ++i) {
if (buffer[i] != " "){ 9999проблема со сравнением
vivod.write(buffer[i],1);}
// }
}
vivod.close();
vvod.close(); // Закрытие файла
return;
}

Еще надо отработать все возможные ошибки


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
сообщение
Сообщение #2


Гость






Цитата
проблема со сравнением
Еще бы, ты пытаешься сравнить символ (char, тот же int, только в профиль) с " ", то есть, со строкой... Сравнивай с символом (в апострофах), проблемы не будет:

    while(!vvod.eof()) {
vvod.read(buffer, 1);
if(buffer[0] != ' ') {
vivod.write(reinterpret_cast<char *>(&buffer[0]), 1); // приведение типа, иначе будет ошибка
}
}

В таком случае, правда, тебе будет проще описать переменную buffer как char, а не как char[5], поскольку буферизацией тут и не пахнет. Если же ты попытаешься читать 5 символов сразу в buffer, подумай над тем, что произойдет, если число символов в исходном файле будет НЕ кратно 5...

Хотя я бы сделал совсем по-другому: читал бы файл source.txt построчно (в std::string), потом из строки удалял бы все пробелы, и записывал строку в выходной файл.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


   vivod.write(reinterpret_cast<char *>(&buffer[0]), 1); // приведение типа, иначе будет ошибка


Можно разжевать эту строчку?

Цитата
Хотя я бы сделал совсем по-другому: читал бы файл source.txt построчно (в std::string), потом из строки удалял бы все пробелы, и записывал строку в выходной файл.


Покажи. Я только начал учить язык.


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Можно разжевать эту строчку?
из этой строки можно убрать приведение типа... У тебя же buffer описывается, как массив char-ов, в этом случае взятие адреса первого элемента возвращает правильный тип, (char *). Я просто перестраховался, на случай, если buffer будет другого типа (например, массив double-ов), тогда тоже можно передать этот буфер в метод write, но для этого надо заставить компилятор рассматривать указатель, как (char *), это делается с помощью конструкции
reinterpret_cast<к_какому_типу_приводим>(что_приводим).

А со строкой делается вот так:
#include <iostream>
#include <fstream>
#include <iomanip>

int main ()
{
std::ifstream vvod;

// Открыть файл для чтения
vvod.open ("source.txt",std::ios::in);
if(!vvod) { // Ошибка?
std::cout << std::endl << "Не могу открыть source.txt для чтения!";
return -1;
}
// Открыть файл для записи
std::ofstream vivod;
vivod.open("target.txt", std::ios::out|std::ios::trunc);
if(!vivod) { // Ошибка?
std::cout << std::endl << "Не могу открыть target.txt для чтения!";
return -1;
}

// Основной цикл...
std::string s;
while(getline(vvod, s)) {
s.erase(std::remove(s.begin(), s.end(), ' '), s.end());
vivod << s << std::endl;
}

vivod.close(); // Закрытие файлов
vvod.close();
return 0;
}
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.06.2024 23:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name