Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
1

Можно ли сначала прочесть файл, а потом открыть его в потоке

12.10.2014, 02:18. Показов 1654. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чувствую, что путаюсь в многочисленных классах файлов/потоков. Пробовал и так и этак - либо выдаст написанное мной общее исключение, либо сделает всё для двух строчек (одной итерации) и зависает. Строк в файле 12 - через одну идут строки с целыми числами, разделённые пробелами.
В коде, если не говорить огульно, мне не нравится, что у меня файл сначала открывается для считывания содержимого в массив строк, а потом открывается в потоке - может быть в этом ошибка.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
                    string[] fullLine = File.ReadAllLines("C://Work c//Cardial.txt", Encoding.Default);
 
                    string newTempLine = "hjxyjtrjjsgf";
 
                    int c = -1;
 
                    FileStream strm = File.Open(@"C:\Work c\Cardial.txt", FileMode.Create, FileAccess.Write);
                    StreamWriter writer = new StreamWriter(strm);
                    if (strm != null)
                    {
                        /*for (int i = 1; i < 12; i += 2)
                        {
                            c += 2;
                            string[] tempLine = fullLine[i].Split(' ');
                            //if (i == 1) MessageBox.Show("{0}", tempLine.ToString());
                            //newFullLine = new string[tempLine.Length];
                            foreach (string s in tempLine)
                            {
                                newTempLine += "drabadan";//(int.Parse(s) + rnd.Next(12, 120)).ToString();
                                newTempLine += " ";
                            }
                            //if(i==1) MessageBox.Show("{0}", newTempLine);*/
                            writer.WriteLine("#{0}", c);
                            writer.WriteLine(newTempLine);
 
                            //foreach (string s in newTempLine)
                            //sw2.WriteLine(newTempLine);
                        //}
                        writer.Flush();
                    }
                    writer.Close();
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2014, 02:18
Ответы с готовыми решениями:

Как сначала описать класс а потом написать его реализацию
Как в C# сначала описать класс а потом написать его реализацию(не используя interface) так, как это...

Дан текстовый файл. В каждой его строке сначала идет текст, а потом - вещественное число. Создать два файла: файл, содер
Дан текстовый файл. В каждой его строке сначала идет текст, а потом - вещественное число. Создать...

Можно ли открыть Мьютекс в другом потоке и освободить его ?
Если мы Перевели Мьютекс в НЕсигнальное состояния внутри нашего потока, ТО разлочить этот мьютекс, ...

Можно ли открыть .xnb, отредактировать его потом опять запихать?
Можно ли открыть .xnb, отредактировать его потом опять запихать? :)

8
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
12.10.2014, 02:26  [ТС] 2
Добавляю проект и файл
Вложения
Тип файла: rar NoiseToFile2.rar (44.7 Кб, 4 просмотров)
0
813 / 421 / 169
Регистрация: 08.02.2013
Сообщений: 711
12.10.2014, 02:28 3
baliar, а чем Вам не нравится способ прочесть все/записать?
0
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
12.10.2014, 02:33  [ТС] 4
Что-то вроде File.WriteAllLines(string path, IEnumerable<string> contents) ?
0
813 / 421 / 169
Регистрация: 08.02.2013
Сообщений: 711
12.10.2014, 02:44 5
baliar, нет, Ваш метод - ReadAllLines итд. Если памяти много ест - лучше открыть на чтение и создать на запись временный файл. Одновременно читать по строкам и записывать. Потом File.Move.
У Вас, возможно ошибка в том, что
C#
1
string newTempLine = "hjxyjtrjjsgf";
лежит вне цикла, и на каждой итерации накапливает большие значения

Добавлено через 8 минут
Вообще, в таких случаях формирование строки лучше делать StringBuilder'ом, потому что s = s+ "..." создаст новую строку и в памяти будет висеть старое и новое значение. А еще лучше - записывать сразу в файл и нигде не хранить предыдущие значения.
1
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
12.10.2014, 03:05  [ТС] 6
Цитата Сообщение от rRczZZ Посмотреть сообщение
записывать сразу в файл и нигде не хранить предыдущие значения
То есть сразу File.Append()?

Добавлено через 16 минут
Возможно моя тема дублируется с ранее созданной Извините за возможные неудобства.
0
813 / 421 / 169
Регистрация: 08.02.2013
Сообщений: 711
12.10.2014, 03:07 7
Лучший ответ Сообщение было отмечено baliar как решение

Решение

baliar, вот примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
string fileName = @"P:\321\Cardial.txt";
string tempName = Path.Combine(
    Path.GetDirectoryName(fileName),
    string.Format(@"{0}.txt", Guid.NewGuid()));
 
using (var sr = new StreamReader(fileName))
using (var wr = new StreamWriter(tempName))
{
    Random rnd = new Random();
    int counter = 0, iNum;
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        if (counter++ % 2 == 0) continue;
 
        wr.WriteLine("#{0}", counter); // тут я не знаю что нужно выводить в задаче
 
        string[] nums = line.Split((string [])null, StringSplitOptions.RemoveEmptyEntries);
        foreach (var sNum in nums)
        {
            if (int.TryParse(sNum, out iNum))
            {
                wr.Write(iNum + rnd.Next(12, 120));
                wr.Write(" ");
            }
        }
        wr.WriteLine();
    }
}
File.Delete(fileName);
File.Move(tempName, fileName);
1
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
12.10.2014, 03:25  [ТС] 8
Вроде бы работает - спасибо. Правда, на ночь уже не стану разбирать код. Завтра, наверное. Ещё раз благодарю.

...Вроде бы примерно то же самое, только совершенно другими методами - сам бы не написал, продолжал бы переставлять наиболее очевидные методы потоков и файлов.
0
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
13.10.2014, 22:36  [ТС] 9
Гм. Дабы не плодить темы с малозначащими названиями... А можно ли как-то разделить логику в описанном выше коде. Скажем нам нужно получать и добавлять в файл разные сигналы - без инкапсуляции выходит копирование кода в каждый новый класс. А если бы был, скажем, File Manager, можно было бы, наверное, как-то открыть поток в его конструкторе, а потом к этому объекту применить метод настроенного на определённый сигнал класса... У меня уже 3ий класс сигналов пошёл и в каждом копипаст с доработкой... Но если тема не очевидна, не заморачивайтесь - попробую сам что-нибудь придумать.
0
13.10.2014, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2014, 22:36
Помогаю со студенческими работами здесь

Как сначала открыть MyForm1, а потом MyForm?
как заставить сначала открывать MyForm1, а потом MyForm? #include &quot;MyForm1.h&quot; #include...

Во второй массив сначала переписать сначала положительные, потом 0, потом отрицательные
Не могу решить задачу, прямо застрял на ней. Помогите, пожалуйста. Нужно: заполнить массив из 10...

Можно ли загрузить в облако текстовый файл и потом отображать его в приложении?
Привет. Реально ли загрузить в облоко текстовый файл и потом отображать его в приложении?

Открыть и прочесть *.amf файл
Здравствуйте форумчане. Необходимо прочесть файл Action Message Format. В Qt есть для этого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru