проблемы с filestream, streamreader и streamwriter

моя первая проблема заключается в том, что если я объявлю свой файловый поток и т. д. таким образом

filestream file;
streamreader file_in;
streamwriter file_out;

try
{
    file = new filestream("data.txt", FileMode.OpenOrCreate);
    file_in = new streamreader(file);
    file_out = new streamwriter(file);
}
catch(IOException exc)
{
    Console.WriteLine(exc.Message);
}

выдает ошибку, в которой говорится «использование неназначенной локальной переменной», что я нахожу странным, потому что все потоки объявлены вне блока try, но внутри основного, поэтому они должны существовать внутри основного.

Моя другая проблема заключается в том, что если я удаляю блок try/catch и просто объявляю потоки одной строкой (например: FileStream file = new FileStream("data.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);), мое чтение из файла работает, однако я не могу писать в файл. моя функция записи в файл выглядит следующим образом:

    public bool write_to_file(ref StreamWriter file_out)
    {
        if (this.is_empty == true)
        {
            Console.WriteLine("error, there is nothing to write.");
            Console.WriteLine("press any key to continue...");
            Console.ReadKey();
            return false;
        }

        try
        {
            string temp = this.is_empty + "," + this.movie_title + "," + this.year_released + "," + this.publisher + "," +
                this.length + "," + this.acting_rating + "," + this.music_rating + "," + this.cinematography_rating + "," +
                this.plot_rating + "," + this.duration_rating + "," + this.total_rating;
            file_out.WriteLine(temp);
            return true;
        }
        catch (IOException exc)
        {
            Console.WriteLine(exc.Message);
            Console.WriteLine("press any key to continue...");
            Console.ReadKey();
            return false;
        }
    }

любая помощь будет высоко оценена, спасибо.


person Damon Swayn    schedule 07.10.2011    source источник
comment
По какой причине вы изменили FileStream на filestream?   -  person Henk Holterman    schedule 07.10.2011
comment
-1, опубликованный вами код (1-я часть) не выдает ошибку, о которой вы заявляете.   -  person Henk Holterman    schedule 07.10.2011


Ответы (3)


Вам нужно присвоить значение вашим переменным вверху, даже если оно просто равно null

FileStream   file     = null;
StreamReader file_in  = null;
StreamWriter file_out = null;
person DJ Quimby    schedule 07.10.2011
comment
спасибо, это исправляет ошибку блока try/catch, однако мой стример по-прежнему не хочет записывать соответствующие данные в файл. не могли бы вы оказать какую-либо помощь в этом? - person Damon Swayn; 07.10.2011
comment
ну, как только я изменил его на это решение, оно снова заработало. поэтому по какой-то неизвестной причине это должно быть необходимо (и меня беспокоит, что я не могу этого понять). - person Damon Swayn; 07.10.2011
comment
Я сам не уверен. @HenkHolterman был прав, мое предложение на самом деле не должно быть необходимым. Кроме того, ваш код выиграет от использования представленной идеи антисанитария. Это безопаснее и правильно избавится от объектов ввода-вывода. - person DJ Quimby; 07.10.2011

Ну, они объявлены, но не назначены... так что либо установите для них значение null, либо просто сделайте все вместе.

try
{
    using(var file = new FileStream("data.txt", FileMode.OpenOrCreate))
    using(var file_in = new StreamReader(file))
    using(var file_out = new StreamWriter(file))
    {
        // Do your thing
    }
}
catch
{
    throw;
}
person canon    schedule 07.10.2011
comment
спасибо, это исправляет ошибку блока try/catch, однако мой стример по-прежнему не хочет записывать соответствующие данные в файл. не могли бы вы оказать какую-либо помощь в этом? - person Damon Swayn; 07.10.2011
comment
Хорошо, покажите полный текст и то, что вы делаете с читателем и писателем (и когда вызываются ваши другие методы). - person canon; 07.10.2011

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

 file_out.Flush();
 file.Flush(); // may be redundant but won't hurt
person sehe    schedule 07.10.2011
comment
спасибо, я поместил file_out.flush() сразу после строки записи, чтобы заставить его записать то, что находится в буфере, в файл и очистить буфер, плюс добавил то, что вы сказали, непосредственно перед закрытием файла, чтобы быть уверенным, и о чудо, это работает. - person Damon Swayn; 07.10.2011
comment
@DamonSwayn: Ура! Рад помочь. Пожалуйста, не забудьте проголосовать за ответы, которые вы нашли полезными, и, при желании, принять ответ, который решил вашу проблему! - person sehe; 07.10.2011