Помощь - Поиск - Пользователи - Календарь
Полная версия: Файлы C++
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
ammaximus
Программа должна копировать содержимое одного файла в дркгой с удалением пробелов. Чтение буферизовано по 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
Цитата
проблема со сравнением
Еще бы, ты пытаешься сравнить символ (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
   vivod.write(reinterpret_cast<char *>(&buffer[0]), 1); // приведение типа, иначе будет ошибка


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

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


Покажи. Я только начал учить язык.
volvo
Цитата
Можно разжевать эту строчку?
из этой строки можно убрать приведение типа... У тебя же 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;
}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.