Запись текста в середину файла - PullRequest
4 голосов
/ 04 января 2009

Можно ли как-нибудь написать текст в файл с определенной точки в файле?

Например, я открываю файл из 10 строк текста, но я хочу записать строку текста в 5-ю строку.

Полагаю, один из способов - вернуть строки текста в файл обратно в виде массива с использованием метода readalllines, а затем добавить строку с определенным индексом в массиве.

Но есть различие в том, что некоторые коллекции могут только добавлять участников в конец, а некоторые - в любое место назначения. Чтобы перепроверить, массив всегда позволял бы мне добавлять значение по любому индексу, верно? (Я уверен, что одна из моих книг написана по-другому).

Кроме того, есть ли лучший способ сделать это?

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 января 2009

О, вздох. Посмотрите алгоритм «Обновление основного файла».

вот псевдокод:

open master file for reading.
count := 0
while not EOF do
    read line from master file into buffer
    write line to output file    
    count := count + 1
    if count = 5 then
       write added line to output file
    fi
od
rename output file to replace input file
1 голос
/ 04 января 2009
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class Class1
{                     
    static void Main()
    {
        var beatles = new LinkedList<string>();
        beatles.AddFirst("John");                        
        LinkedListNode<string> nextBeatles = beatles.AddAfter(beatles.First, "Paul");
        nextBeatles = beatles.AddAfter(nextBeatles, "George");
        nextBeatles = beatles.AddAfter(nextBeatles, "Ringo");

        // change the 1 to your 5th line
        LinkedListNode<string> paulsNode = beatles.NodeAt(1); 
        LinkedListNode<string> recentHindrance = beatles.AddBefore(paulsNode, "Yoko");
        recentHindrance = beatles.AddBefore(recentHindrance, "Aunt Mimi");
        beatles.AddBefore(recentHindrance, "Father Jim");

        Console.WriteLine("{0}", string.Join("\n", beatles.ToArray()));
        Console.ReadLine();                       
    }
}

public static class Helper
{
    public static LinkedListNode<T> NodeAt<T>(this LinkedList<T> l, int index)
    {
        LinkedListNode<T> x = l.First;

        while ((index--) > 0) x = x.Next;

        return x;
    }
}
1 голос
/ 04 января 2009

Если вы читаете / пишете небольшие файлы (скажем, менее 20 мегабайт - да, я считаю 20M «маленьким») и не пишете их так часто (как, например, несколько раз в секунду), тогда просто читайте / пишите все дело.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...