none
Поиск строки в файле. RRS feed

  • Вопрос

  • С++, консольные приложение, Visual Studio 2013 для Desktop.

    С клавиатуры ввожу номер строки в txt файле которую мне нужно стереть. Дальше он стирает строку полностью.После стирания этой строки пойдёт запись новых символов. Не знаю как перемещаться по строкам внутри файла. Помогите пожалуйста.


    • Изменено Potolok 8 апреля 2014 г. 19:32
    8 апреля 2014 г. 18:20

Ответы

  • Перезаписать часть файла невозможно. Его можно только "переписать" или дополнить. Прочитайте файл в массив (контейнер) строк. Выполните необходимые изменения, а затем запишите данные в файл заново.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Potolok 8 апреля 2014 г. 20:57
    8 апреля 2014 г. 20:49

Все ответы

  • Перезаписать часть файла невозможно. Его можно только "переписать" или дополнить. Прочитайте файл в массив (контейнер) строк. Выполните необходимые изменения, а затем запишите данные в файл заново.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Potolok 8 апреля 2014 г. 20:57
    8 апреля 2014 г. 20:49
  • kosuke904 - "Перезаписать часть файла невозможно..."

    Это не совсем так.
    Возможен прямой доступ к записям файла - дополнение, исправление, удаление.
    Но это должно быть программно организовано,
    другое дело, что эта организация достаточно муторна.
    http://social.msdn.microsoft.com/Forums/ru-RU/32b94ee4-faa3-4e76-991c-95f33621a2cb/-?forum=fordesktopru
    Эта возможность была всегда, начиная с очень давнего Фортрана,
    продолжает быть и вряд ли когда-либо исчезнет.

    • Изменено QazRdx 9 апреля 2014 г. 3:35
    9 апреля 2014 г. 3:32
  • Как я понял, человек интересовался стандартными библиотечными средствами. Понятно, что для самоутверждения можно как угодно "издеваться" над файловой системой :) Но возникает резонный вопрос - а зачем?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    9 апреля 2014 г. 10:37
  • kosuke904 - 

    "... для самоутверждения ..." - 

    Не судите, да не судимы будете !
    Видимо это актуально для Вас, если Вы говорите об этом.
    Я же давно перешагнул через эти условности -
    мы с Вами в разных весовых категориях.

    Взгляните, тема за пару дней собрала почти 2000 просмотров,
    и, надо полагать, люди, которым она интересна, -
    это студенты, а не праздно шатающаяся публика.
    В серьезных ВУЗах, и это мне доподлинно известно, 
    студентам порой задают очень простые вопросы,
    но ответить на них иной раз совсем не просто.
    Обсуждаемый вопрос, возможно, из этой категории.
    Во всяком случае, если бы моему младшему сыну там, 
    где он учится, был бы задан подобный вопрос,
    то от него потребовалось бы совсем не то решение,
    которое Вы отстаиваете.

    Теперь поговорим о "стандартных библиотечных средствах",
    поскольку уж Вы их коснулись.

    Даже в упомянутом в моем предыдущем комментарии Фортране
    было в свое время всего-навсего 25 - 30, 
    подчеркиваю - НЕ БИБЛИОТЕЧНЫХ, а СТАНДАРТНЫХ, операторов,
    среди которых достойное место занимал очень популярный тогда
    оператор DEFINEFILE, определявщий формат файла с прямым доступом,
    Этот оператор применялся для больших файлов с 
    целью ускорения выборки нужной части информации.

    С тех пор много воды утекло, появились БД, базы данных,
    которых в то время, трудно поверить, просто еще не существовало.
    Но большие файлы остались большими файлами,
    мощности компьютеров как не хватало, так зачастую и не хватает...
    Изменился уровень, порядок мощностей и ресурсов,
    но трудиться и оптимизировать приходится все также, 
    не меньше, чем раньше...

    .Net никоим образом не миновал тех самых "стандартных средств". 
    Практикующему программеру это, возможно, не пригодится,
    но студентам знать полезно, поскольку их учат не только тому,
    как пользоваться теми или иными инструментами,
    но и тому, как эти инструменты устроены.
    А БД напрямую используют большие файлы именно с 
    прямым доступом, поэтому и работают достаточно быстро.
    Если бы всякий раз для того, чтобы что-то где-то исправить,
    нужно было бы прочесть весь файл, 
    а потом его снова перезаписать... 
    Ужас - во сне приснится - можно и не проснуться.
    Файлы-то бывают ну очень большими, гигабайты и гигабайты,
    никакой памяти не хватит.

    А теперь о "стандартных средствах" в .Net
    ( или нестандартных - как кому нравится ).

    ASCIIEncoding Ascii = new ASCIIEncoding();
    int BeginNumberByte = 1000000; // Номер начального байта в файле
    int ByteArrayLength = 1000; // Размер байтового буфера для прочитанных байтов
    byte [] ByteArray = new byte[ByteArrayLength]; // Байтовый буфер для чтения
    // Поток для чтения 
    FileStream f=new FileStream(FileName,FileMode.Open); f.Position=BeginNumberByte; // Начальная позиция в файле, с которой нужно начать читать
    f.Read ( ByteArray,0,ByteArrayLength); // Чтение из файла
    // Преобразование массива байтов в текст
    string [] SArray = Ascii.GetString(ByteArray).Split(new string[]{"\r\n"},System.StringSplitOptions.RemoveEmptyEntries);
    f.Close();

    Дополнительно организовывается индексный файл,
    в котором записываются номера начальных байтов
    всех записей в содержательном файле и размер каждой записи.

    Еще раз повторю, муторное это дело -
    организация такого вот файлового доступа,
    но иногда, очень полезное.
    Хотя есть альтернатива - БД.





    • Изменено QazRdx 10 апреля 2014 г. 0:32
    9 апреля 2014 г. 23:52
  • Я в курсе, что позиция чтения в файле может быть произвольной :) А теперь продемонстрируйте, как СТАНДАРНЫМИ средствами выполнить ИЗМЕНЕНИЕ информации ВНУТРИ файла. Только, пожалуйста, без искусственно создаваемых "индексных файлов", без чтения/записи файлов по секторам, в общем, всего того, что я и назвал "издевательством".

    И еще. Не принимайте Вы, пожалуйста, на свой счет, все что здесь пишут. Это просто дискуссия, ничего личного :)


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    10 апреля 2014 г. 6:43
  • Конечно же, когда файлы не велики, 
    я пользуюсь и тем методом,
    который предложили Вы.
    На моем компе это не критично,
    но в облаке, где висят мои программы,
    мои ресурсы ограничены, поскольку стоят денег, 
    я не могу себе позволить роскошь 
    работать таким образом.
    Поэтому когда я имею дело с большими файлами,
    а у меня сейчас именно такие файлы, 
    и их много, сотни,
    текстовые до 500 Мб и более,
    а мне что-нибудь нужно в них подправить,
    что бывает достаточно редко,
    я конечно же не закачиваю их целиком в память.
    Читаю последовательно каждую запись,
    правлю ее и перезаписываю также последовательно 
    в выходной файл.
    Время работы практически то же самое,
    но с памятью все гораздо проще.
    Когда-то очень давно мне за две недели
    удалось решить подобную проблему,
    которую мои предшественники за несколько лет 
    решить так и не смогли -
    пытались закачивать свои файлы целиком,
    а они не помещались, приходилось настраивать
    какие-то оверлеи, а это и вовсе дремучий лес...
    10 апреля 2014 г. 8:36