Перезапись файла c++
только начинаю программировать. Никак не могу доделать программу. Нужно написать программу, которая считывает английский текст из файла и записывает в другой файл слова текста, начинающиеся и оканчивающиеся на гласные буквы, но пока получилось только выписывать слово которое начинается на гласную. Буду очень благодарен за ответ. P.S Обязательное условие по заданию — библиотека stdio.h, заранее спасибо 🙂
#include #include #pragma warning (disable : 4996) using namespace std; bool vowel(char ch) < char a[] = "AEIOUYaeiouy"; for (int i = 0; i < sizeof(a); i++) if (ch == a[i]) return 1; return 0; >bool end_of_word(char res) < char b[] = " \n,.;. )\""; for (int i = 0; i < sizeof(b); i++) if (res == b[i]) return 1; return 0; >void func(FILE* fin, FILE* fout) < char ch = ' '; char res = ' '; while (!feof(fin)) < ch = getc(fin); if (end_of_word(res) && vowel(ch)) < res = '1'; while (!end_of_word(res)) < putc(ch, fout); ch = fgetc(fin); res = ch; >fputs(" ", fout); > res = ch; > > int main() < setlocale(LC_ALL, "ru"); FILE* fin = fopen("C:\\Users\\User\\Desktop\\дзшки 2 сем\\ОП\\lab_eight_c\\file1.txt", "r"); if (!fin) < cerr « "Файл file1.txt не удалось открыть!" « endl; >FILE* fout = fopen("C:\\Users\\User\\Desktop\\дзшки 2 сем\\ОП\\lab_eight_c\\file2.txt", "w"); if (!fout) < cerr « "Файл file2.txt не удалось открыть!" « endl; >func(fin, fout); cout « "В текстовый файл file2.txt были записаны обработанные данные из файла file1.txt" « endl « "То есть только слова, начинающиеся с гласной буквы (если таковые имелись)" « endl « "Конец работы программы" « endl; fclose (fin); fclose (fout); return 0; >
Отслеживать
задан 13 июн 2021 в 0:33
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
#include #include using namespace std; bool gl(char a) < if (a == 97 || a == 65 || a == 101 || a == 69 || a == 105 || a == 73 || a == 111 || a == 79 || a == 117 || a == 85 || a == 121 || a == 89) < return 1; >else return 0; > bool check(string t) < if ((gl(t[0]))&& (gl(t[t.size() - 1]))) < return 1; >else return 0; > int main() < ifstream Q("abc.txt"); string t; ofstream Z("def.txt"); while (!Q.eof()) < Q >> t; if (check(t)) < Z > Q.close(); Z.close(); return INT16_MAX; >
Отслеживать
ответ дан 20 июн 2021 в 19:01
user448475 user448475
с выбором гласных букв решил очень плохим способом, буду признателен, если кто-нибудь решит изящнее
File. Write All Text Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Создает новый файл, записывает в него содержимое и затем закрывает файл. Если целевой файл уже существует, он усекается и перезаписывается.
Перегрузки
Создает новый файл, записывает в него указанную строку и затем закрывает файл. Если целевой файл уже существует, он усекается и перезаписывается.
Создает новый файл, записывает указанную строку в этот файл, используя заданную кодировку, и затем закрывает файл. Если целевой файл уже существует, он усекается и перезаписывается.
WriteAllText(String, String)
Создает новый файл, записывает в него указанную строку и затем закрывает файл. Если целевой файл уже существует, он усекается и перезаписывается.
public: static void WriteAllText(System::String ^ path, System::String ^ contents);
public static void WriteAllText (string path, string contents);
public static void WriteAllText (string path, string? contents);
static member WriteAllText : string * string -> unit
Public Shared Sub WriteAllText (path As String, contents As String)
Параметры
Файл, в который осуществляется запись.
Строка, которую нужно записать в файл.
Исключения
платформа .NET Framework и .NET Core версий старше 2.1: path строка нулевой длины, содержит только пробелы или содержит один или несколько недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars().
path имеет значение null .
Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.
Указан недопустимый путь (например, он ведет на несопоставленный диск).
При открытии файла произошла ошибка ввода-вывода.
Параметр path указывает файл, доступный только для чтения.
path указывает файл, который скрыт.
Эта операция не поддерживается на текущей платформе.
Параметр path определяет каталог.
У вызывающего объекта отсутствует необходимое разрешение.
Параметр path задан в недопустимом формате.
У вызывающего объекта отсутствует необходимое разрешение.
Примеры
В следующем примере кода показано использование метода для WriteAllText записи текста в файл. В этом примере создается файл, если он еще не существует, и в него добавляется текст.
using System; using System.IO; using System.Text; class Test < public static void Main() < string path = @"c:\temp\MyTest.txt"; // This text is added only once to the file. if (!File.Exists(path)) < // Create a file to write to. string createText = "Hello and Welcome" + Environment.NewLine; File.WriteAllText(path, createText); >// This text is always added, making the file longer over time // if it is not deleted. string appendText = "This is extra text" + Environment.NewLine; File.AppendAllText(path, appendText); // Open the file to read from. string readText = File.ReadAllText(path); Console.WriteLine(readText); > >
open System open System.IO let path = @"c:\temp\MyTest.txt" // This text is added only once to the file. if File.Exists path |> not then // Create a file to write to. let createText = "Hello and Welcome" + Environment.NewLine File.WriteAllText(path, createText) // This text is always added, making the file longer over time // if it is not deleted. let appendText = "This is extra text" + Environment.NewLine File.AppendAllText(path, appendText) // Open the file to read from. let readText = File.ReadAllText path printfn $""
Imports System.IO Imports System.Text Public Class Test Public Shared Sub Main() Dim path As String = "c:\temp\MyTest.txt" ' This text is added only once to the file. If File.Exists(path) = False Then ' Create a file to write to. Dim createText As String = "Hello and Welcome" + Environment.NewLine File.WriteAllText(path, createText) End If ' This text is always added, making the file longer over time ' if it is not deleted. Dim appendText As String = "This is extra text" + Environment.NewLine File.AppendAllText(path, appendText) ' Open the file to read from. Dim readText As String = File.ReadAllText(path) Console.WriteLine(readText) End Sub End Class
Комментарии
Этот метод использует кодировку UTF-8 без Byte-Order Mark (BOM), поэтому при использовании GetPreamble метода возвращается пустой массив байтов. Если необходимо включить идентификатор UTF-8, например метку порядка байтов, в начале файла, используйте перегрузку WriteAllText(String, String, Encoding) метода с UTF8 кодировкой.
При использовании строки и пути к файлу этот метод открывает указанный файл, записывает строку в файл, а затем закрывает файл.
Применяется к
WriteAllText(String, String, Encoding)
Создает новый файл, записывает указанную строку в этот файл, используя заданную кодировку, и затем закрывает файл. Если целевой файл уже существует, он усекается и перезаписывается.
public: static void WriteAllText(System::String ^ path, System::String ^ contents, System::Text::Encoding ^ encoding);
public static void WriteAllText (string path, string contents, System.Text.Encoding encoding);
public static void WriteAllText (string path, string? contents, System.Text.Encoding encoding);
static member WriteAllText : string * string * System.Text.Encoding -> unit
Public Shared Sub WriteAllText (path As String, contents As String, encoding As Encoding)
Параметры
Файл, в который осуществляется запись.
Строка, которую нужно записать в файл.
Кодировка, которую необходимо применить к строке.
Исключения
платформа .NET Framework и .NET Core версий старше 2.1: path строка нулевой длины, содержит только пробелы или содержит один или несколько недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars().
path имеет значение null .
Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.
Указан недопустимый путь (например, он ведет на несопоставленный диск).
При открытии файла произошла ошибка ввода-вывода.
Параметр path указывает файл, доступный только для чтения.
path указывает файл, который скрыт.
Эта операция не поддерживается на текущей платформе.
Параметр path определяет каталог.
У вызывающего объекта отсутствует необходимое разрешение.
Параметр path задан в недопустимом формате.
У вызывающего объекта отсутствует необходимое разрешение.
Примеры
В следующем примере кода показано использование метода для WriteAllText записи текста в файл. В этом примере создается файл, если он еще не существует, и в него добавляется текст.
using System; using System.IO; using System.Text; class Test < public static void Main() < string path = @"c:\temp\MyTest.txt"; // This text is added only once to the file. if (!File.Exists(path)) < // Create a file to write to. string createText = "Hello and Welcome" + Environment.NewLine; File.WriteAllText(path, createText, Encoding.UTF8); >// This text is always added, making the file longer over time // if it is not deleted. string appendText = "This is extra text" + Environment.NewLine; File.AppendAllText(path, appendText, Encoding.UTF8); // Open the file to read from. string readText = File.ReadAllText(path); Console.WriteLine(readText); > >
open System open System.IO open System.Text let path = @"c:\temp\MyTest.txt" // This text is added only once to the file. if File.Exists path |> not then // Create a file to write to. let createText = "Hello and Welcome" + Environment.NewLine File.WriteAllText(path, createText, Encoding.UTF8) // This text is always added, making the file longer over time // if it is not deleted. let appendText = "This is extra text" + Environment.NewLine File.AppendAllText(path, appendText, Encoding.UTF8) // Open the file to read from. let readText = File.ReadAllText path printfn $""
Imports System.IO Imports System.Text Public Class Test Public Shared Sub Main() Dim path As String = "c:\temp\MyTest.txt" Dim sw As StreamWriter ' This text is added only once to the file. If File.Exists(path) = False Then ' Create a file to write to. Dim createText As String = "Hello and Welcome" + Environment.NewLine File.WriteAllText(path, createText, Encoding.UTF8) End If ' This text is always added, making the file longer over time ' if it is not deleted. Dim appendText As String = "This is extra text" + Environment.NewLine File.AppendAllText(path, appendText, Encoding.UTF8) ' Open the file to read from. Dim readText As String = File.ReadAllText(path) Console.WriteLine(readText) End Sub End Class
Комментарии
При использовании строки и пути к файлу этот метод открывает указанный файл, записывает строку в файл с использованием указанной кодировки, а затем закрывает файл. Этот метод гарантированно закрывает дескриптор файла, даже если возникают исключения.
Как перезаписать текстовый файл в Qt C++?
Всем доброго времени суток. Нужен совет. Есть текстовый файл, нужно удалить из него строку. На просторах рунета прочитал, что такое можно реализовать с помощью перезаписи, но как именно это сделать я не нашёл. Отмечу, что размер файла может быть больше размера ОЗУ.
Моя версия: Создаю второй файл. И с помощью условия записываю в него строки, которые удалять не нужно. Правильно ли это? Или есть способ всё реализовать с одним файлом? Хотелось бы услышать и другие способы, помимо перезаписи. Спасибо.
- Вопрос задан более трёх лет назад
- 290 просмотров
3 комментария
Простой 3 комментария
Как перезаписывать файл c
Нужно открывать фаил в fstream, копировать его содержимое в строку string, работать с ней как с буфером, а при условии, что она изменена, перезаписывать файл её содержимым.
Т.е. так. Открываем:
char *fn; string *buf; fstream *fS; fS->open(fname, ios_base::in | ios_base::out); if(!fS->is_open()) < fS->open(fname, ios_base::in | ios_base::out | ios_base::trunc); if(!fS->is_open()) return 1; > this->defSize(); char *tstr = new char[this->size]; this->buf = new string(); fS->read(tstr, this->size); this->buf->insert(0, tstr);
А затем надо сохранить содержимое buf в файл fS.
Сначала необходимо удалить предыдущее содержимое. Пробовал двумя способами.
Первый:
this->fS->clear();
this->fS->close(); this->fS->open(this->fn, ios_base::in | ios_base::out | ios_base::trunc);
После чего запись:
fS->seekg(0, ios_base::beg); char *tstr = new char[this->size]; strcpy(tstr, buf->data()); this->fS->write(tstr, size);
В первом случае, если содержимое буфера уменьшилось, то на конце файла будут символы ‘H’.
Во втором — на выходе оказывается пустой файл.
Как правильно перезаписать файл fstream?
Re: Перезаписать fstream
| От: | LaptevVV |
| Дата: | 12.09.08 11:09 |
| Оценка: |
Здравствуйте, NordWest, Вы писали:
NW>Нужно открывать фаил в fstream, копировать его содержимое в строку string, работать с ней как с буфером, а при условии, что она изменена, перезаписывать файл её содержимым.
NW>Т.е. так. Открываем:
NW>
NW> char *fn; NW> string *buf; NW> fstream *fS; fS->>open(fname, ios_base::in | ios_base::out); NW> if(!fS->is_open()) NW> < fS->>open(fname, ios_base::in | ios_base::out | ios_base::trunc); NW> if(!fS->is_open()) return 1; NW> > this->>defSize(); NW> char *tstr = new char[this->size]; this->>buf = new string(); fS->>read(tstr, this->size); this->>buf->insert(0, tstr); NW>
Вопросы:
1. Зачем тотальное использование указателей? Почему нельзя объявить просто указатель на поток, а не указатель на него? Аналогично: почему указатель на строку, а не просто строка?
2. Файл по умолчанию текстовый. Читаешь ты его методом read — в символьный массив. А внутри символы ‘\n’ отсутствуют? А ноль на конце символьного массива есть? При вставке проблем не будет?
NW>А затем надо сохранить содержимое buf в файл fS.
NW>Сначала необходимо удалить предыдущее содержимое. Пробовал двумя способами.
NW>Первый:
NW>
this->>fS->clear(); NW>
Это неверно. Метод clear очищает флаги, а не файл.
NW>Второй:
NW>
this->>fS->close(); this->>fS->open(this->fn, ios_base::in | ios_base::out | ios_base::trunc); NW>
Гораздо проще записать в новый временный файл, а потом просто переименовать.
Хочешь быть счастливым — будь им!
Без булдырабыз.
Re: Перезаписать fstream
| От: | codelord | |
| Дата: | 15.09.08 08:40 | |
| Оценка: | 3 (1) | |
Здравствуйте, NordWest, Вы писали:
NW>Нужно открывать фаил в fstream, копировать его содержимое в строку string, работать с ней как с буфером, а при условии, что она изменена, перезаписывать файл её содержимым.
Может конечно очень многословно, но вот например так:
#include #include size_t get_file_size( const char * filename ) < FILE *fp = fopen( filename, "rb" ); if ( !fp ) < return 0; > size_t res; fpos_t position; if ( fgetpos(fp, &position) ) //запоминаем текущую позицию < fclose(fp); return -1; > //ошибка получения текущей позиции файла fseek(fp, 0, SEEK_END); //смещаемся в конец файла res = ftell(fp); //читаем положение указателя в конце файла if ( fsetpos(fp, &position) ) //кладем откуда взяли (позицию файла) < fclose(fp); return -1; > //ошибка установки позиции файла fclose(fp); return res; > void file_to_buf( char *buf, size_t _len, std::string filename ) < std::ifstream infile( filename.c_str(), std::ios::binary ); if ( !infile ) < return; > infile.read( buf, _len ); infile.close(); > int main() < std::string filename = "infile.txt"; size_t fsize = get_file_size( filename.c_str() ); char *buf = new char[ fsize ]; file_to_buf( buf, fsize, filename ); //Работаем с буфером buf[0] = 'A'; //можем копировать буфер чтобы сравнивать до и после изменений //и в случае если изменилось перезаписать файл std::ofstream outfile( filename.c_str() ); outfile.write( buf, fsize ); >
Re[2]: Перезаписать fstream
| От: | codelord |
| Дата: | 15.09.08 08:43 |
| Оценка: |
Здравствуйте, codelord, Вы писали:
C>Может конечно очень многословно, но вот например так:
Ой там в последнюю строчку надо
delete [] buf;
Re[2]: Перезаписать fstream
| От: | NordWest |
| Дата: | 15.09.08 15:47 |
| Оценка: |
Здравствуйте, codelord, Вы писали:
C> std::ofstream outfile( filename.c_str() );
C> outfile.write( buf, fsize );
fsize может поменяться.
Re[3]: Перезаписать fstream
| От: | codelord |
| Дата: | 16.09.08 05:14 |
| Оценка: |
Здравствуйте, NordWest, Вы писали:
NW>Здравствуйте, codelord, Вы писали:
C>> std::ofstream outfile( filename.c_str() );
C>> outfile.write( buf, fsize );
NW>fsize может поменяться.
Ну так это же пример, меняйте
Re[4]: Перезаписать fstream
| От: | NordWest |
| Дата: | 16.09.08 06:11 |
| Оценка: |
Здравствуйте, codelord, Вы писали:
C>Здравствуйте, NordWest, Вы писали:
NW>>Здравствуйте, codelord, Вы писали:
C>>> std::ofstream outfile( filename.c_str() );
C>>> outfile.write( buf, fsize );
NW>>fsize может поменяться.
C>Ну так это же пример, меняйте
Re[5]: Перезаписать fstream
| От: | Аноним |
| Дата: | 16.09.08 11:51 |
| Оценка: |