![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
ammaximus |
![]()
Сообщение
#1
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
Программа должна копировать содержимое одного файла в дркгой с удалением пробелов. Чтение буферизовано по 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;
}
Еще надо отработать все возможные ошибки -------------------- Не думай о белой обезьяне.
|
![]() ![]() |
volvo |
![]()
Сообщение
#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), потом из строки удалял бы все пробелы, и записывал строку в выходной файл. |
ammaximus |
![]()
Сообщение
#3
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
vivod.write(reinterpret_cast<char *>(&buffer[0]), 1); // приведение типа, иначе будет ошибка
Можно разжевать эту строчку? Цитата Хотя я бы сделал совсем по-другому: читал бы файл source.txt построчно (в std::string), потом из строки удалял бы все пробелы, и записывал строку в выходной файл. Покажи. Я только начал учить язык. -------------------- Не думай о белой обезьяне.
|
volvo |
![]()
Сообщение
#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;
}
|
![]() ![]() |
![]() |
Текстовая версия | 8.08.2025 1:26 |