Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/75: Рейтинг темы: голосов - 75, средняя оценка - 4.89
7 / 9 / 4
Регистрация: 25.02.2017
Сообщений: 139

Считать последнюю строку из файла

08.11.2017, 07:23. Показов 16343. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, у меня есть текстовый файл с содержимым
C#
1
2
3
1 audi 1999 vasil
0 ford 2009 genri
0 lada 1980 leonid
Мне нужно в строку считать только последнюю строку. Возможно ли это сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2017, 07:23
Ответы с готовыми решениями:

Как добаватить текст в последнюю строку текстового файла
пересмотрел много в Гугле, подскажите пожалуйста,как добавить текст в первую строку текстового файла,перед всем остальным текстом ...

Удалить последнюю строку из файла и посчитать количество символов в тексте
Прочитали текст из файла и теперь нужно удалить последнюю строку и посчитать количество символов в тексте.

Считать последнюю строку файла
Доброго времени суток! есть файл который имеет структуру(ниже), надо считать данные. До последней строки получается. Как быть с последней...

28
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
08.11.2017, 07:27
Крок, да возможно. Только это "вручную" делать придётся. Открываете поток файла, перематываете указатель позиции чтения в самый конец потока, потом читаете посимвольно данные в обратном порядке, к началу, пока не попадётся символ переноса строки (CRLF или просто LF), это и будет начало последней строки. Можно будет или данные ранее прочитанные "развернуть" или заново всё прочитать, но уже в сторону конца файла. Ну и сразу же после перемотки вы можете видеть символ переноса строки, так как последняя строка таким символом тоже может заканчиваться, его нужно будет проигнорировать.
0
7 / 9 / 4
Регистрация: 25.02.2017
Сообщений: 139
08.11.2017, 07:37  [ТС]
Спасибо, буду пробовать
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
08.11.2017, 08:15
Крок, а string s = File.ReadAllLines("").Last(); Вам не подойдет? Или же Вам нужна именно последняя строка файла, без загрузки его в память?
0
08.11.2017, 08:20

Не по теме:

Shogun31337, я вот прямо ожидал, что кто-нибудь такое предложит. :)

0
08.11.2017, 08:30

Не по теме:

Usaga, ну дык самое очевидное решение. :)

0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
08.11.2017, 11:24

Не по теме:


Цитата Сообщение от Shogun31337 Посмотреть сообщение
ну дык самое очевидное решение
Количества слез, пролитого нормальными программистами при работе с чужим кодом, состоящим только из "очевидных"
и, находящихся на первых строках результата поиска решений, хватит на over9000 всемирных потопов :(



Цитата Сообщение от Крок Посмотреть сообщение
Мне нужно в строку считать только последнюю строку.
Взято отсюда

Кликните здесь для просмотра всего текста

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
 
namespace MiscUtil.IO
{
    /// <summary>
    /// Takes an encoding (defaulting to UTF-8) and a function which produces a seekable stream
    /// (or a filename for convenience) and yields lines from the end of the stream backwards.
    /// Only single byte encodings, and UTF-8 and Unicode, are supported. The stream
    /// returned by the function must be seekable.
    /// </summary>
    public sealed class ReverseLineReader : IEnumerable<string>
    {
        /// <summary>
        /// Buffer size to use by default. Classes with internal access can specify
        /// a different buffer size - this is useful for testing.
        /// </summary>
        private const int DefaultBufferSize = 4096;
 
        /// <summary>
        /// Means of creating a Stream to read from.
        /// </summary>
        private readonly Func<Stream> streamSource;
 
        /// <summary>
        /// Encoding to use when converting bytes to text
        /// </summary>
        private readonly Encoding encoding;
 
        /// <summary>
        /// Size of buffer (in bytes) to read each time we read from the
        /// stream. This must be at least as big as the maximum number of
        /// bytes for a single character.
        /// </summary>
        private readonly int bufferSize;
 
        /// <summary>
        /// Function which, when given a position within a file and a byte, states whether
        /// or not the byte represents the start of a character.
        /// </summary>
        private Func<long,byte,bool> characterStartDetector;
 
        /// <summary>
        /// Creates a LineReader from a stream source. The delegate is only
        /// called when the enumerator is fetched. UTF-8 is used to decode
        /// the stream into text.
        /// </summary>
        /// <param name="streamSource">Data source</param>
        public ReverseLineReader(Func<Stream> streamSource)
            : this(streamSource, Encoding.UTF8)
        {
        }
 
        /// <summary>
        /// Creates a LineReader from a filename. The file is only opened
        /// (or even checked for existence) when the enumerator is fetched.
        /// UTF8 is used to decode the file into text.
        /// </summary>
        /// <param name="filename">File to read from</param>
        public ReverseLineReader(string filename)
            : this(filename, Encoding.UTF8)
        {
        }
 
        /// <summary>
        /// Creates a LineReader from a filename. The file is only opened
        /// (or even checked for existence) when the enumerator is fetched.
        /// </summary>
        /// <param name="filename">File to read from</param>
        /// <param name="encoding">Encoding to use to decode the file into text</param>
        public ReverseLineReader(string filename, Encoding encoding)
            : this(() => File.OpenRead(filename), encoding)
        {
        }
 
        /// <summary>
        /// Creates a LineReader from a stream source. The delegate is only
        /// called when the enumerator is fetched.
        /// </summary>
        /// <param name="streamSource">Data source</param>
        /// <param name="encoding">Encoding to use to decode the stream into text</param>
        public ReverseLineReader(Func<Stream> streamSource, Encoding encoding)
            : this(streamSource, encoding, DefaultBufferSize)
        {
        }
 
        internal ReverseLineReader(Func<Stream> streamSource, Encoding encoding, int bufferSize)
        {
            this.streamSource = streamSource;
            this.encoding = encoding;
            this.bufferSize = bufferSize;
            if (encoding.IsSingleByte)
            {
                // For a single byte encoding, every byte is the start (and end) of a character
                characterStartDetector = (pos, data) => true;
            }
            else if (encoding is UnicodeEncoding)
            {
                // For UTF-16, even-numbered positions are the start of a character.
                // TODO: This assumes no surrogate pairs. More work required
                // to handle that.
                characterStartDetector = (pos, data) => (pos & 1) == 0;
            }
            else if (encoding is UTF8Encoding)
            {
                // For UTF-8, bytes with the top bit clear or the second bit set are the start of a character
                // See http://www.cl.cam.ac.uk/~mgk25/unicode.html
                characterStartDetector = (pos, data) => (data & 0x80) == 0 || (data & 0x40) != 0;
            }
            else
            {
                throw new ArgumentException("Only single byte, UTF-8 and Unicode encodings are permitted");
            }
        }
 
        /// <summary>
        /// Returns the enumerator reading strings backwards. If this method discovers that
        /// the returned stream is either unreadable or unseekable, a NotSupportedException is thrown.
        /// </summary>
        public IEnumerator<string> GetEnumerator()
        {
            Stream stream = streamSource();
            if (!stream.CanSeek)
            {
                stream.Dispose();
                throw new NotSupportedException("Unable to seek within stream");
            }
            if (!stream.CanRead)
            {
                stream.Dispose();
                throw new NotSupportedException("Unable to read within stream");
            }
            return GetEnumeratorImpl(stream);
        }
 
        private IEnumerator<string> GetEnumeratorImpl(Stream stream)
        {
            try
            {
                long position = stream.Length;
 
                if (encoding is UnicodeEncoding && (position & 1) != 0)
                {
                    throw new InvalidDataException("UTF-16 encoding provided, but stream has odd length.");
                }
 
                // Allow up to two bytes for data from the start of the previous
                // read which didn't quite make it as full characters
                byte[] buffer = new byte[bufferSize + 2];
                char[] charBuffer = new char[encoding.GetMaxCharCount(buffer.Length)];
                int leftOverData = 0;
                String previousEnd = null;
                // TextReader doesn't return an empty string if there's line break at the end
                // of the data. Therefore we don't return an empty string if it's our *first*
                // return.
                bool firstYield = true;
 
                // A line-feed at the start of the previous buffer means we need to swallow
                // the carriage-return at the end of this buffer - hence this needs declaring
                // way up here!
                bool swallowCarriageReturn = false;
 
                while (position > 0)
                {
                    int bytesToRead = Math.Min(position > int.MaxValue ? bufferSize : (int)position, bufferSize);
 
                    position -= bytesToRead;
                    stream.Position = position;
                    StreamUtil.ReadExactly(stream, buffer, bytesToRead);
                    // If we haven't read a full buffer, but we had bytes left
                    // over from before, copy them to the end of the buffer
                    if (leftOverData > 0 && bytesToRead != bufferSize)
                    {
                        // Buffer.BlockCopy doesn't document its behaviour with respect
                        // to overlapping data: we *might* just have read 7 bytes instead of
                        // 8, and have two bytes to copy...
                        Array.Copy(buffer, bufferSize, buffer, bytesToRead, leftOverData);
                    }
                    // We've now *effectively* read this much data.
                    bytesToRead += leftOverData;
 
                    int firstCharPosition = 0;
                    while (!characterStartDetector(position + firstCharPosition, buffer[firstCharPosition]))
                    {
                        firstCharPosition++;
                        // Bad UTF-8 sequences could trigger this. For UTF-8 we should always
                        // see a valid character start in every 3 bytes, and if this is the start of the file
                        // so we've done a short read, we should have the character start
                        // somewhere in the usable buffer.
                        if (firstCharPosition == 3 || firstCharPosition == bytesToRead)
                        {
                            throw new InvalidDataException("Invalid UTF-8 data");
                        }
                    }
                    leftOverData = firstCharPosition;
 
                    int charsRead = encoding.GetChars(buffer, firstCharPosition, bytesToRead - firstCharPosition, charBuffer, 0);
                    int endExclusive = charsRead;
 
                    for (int i = charsRead - 1; i >= 0; i--)
                    {
                        char lookingAt = charBuffer[i];
                        if (swallowCarriageReturn)
                        {
                            swallowCarriageReturn = false;
                            if (lookingAt == '\r')
                            {
                                endExclusive--;
                                continue;
                            }
                        }
                        // Anything non-line-breaking, just keep looking backwards
                        if (lookingAt != '\n' && lookingAt != '\r')
                        {
                            continue;
                        }
                        // End of CRLF? Swallow the preceding CR
                        if (lookingAt == '\n')
                        {
                            swallowCarriageReturn = true;
                        }
                        int start = i + 1;
                        string bufferContents = new string(charBuffer, start, endExclusive - start);
                        endExclusive = i;
                        string stringToYield = previousEnd == null ? bufferContents : bufferContents + previousEnd;
                        if (!firstYield || stringToYield.Length != 0)
                        {
                            yield return stringToYield;
                        }
                        firstYield = false;
                        previousEnd = null;
                    }
 
                    previousEnd = endExclusive == 0 ? null : (new string(charBuffer, 0, endExclusive) + previousEnd);
 
                    // If we didn't decode the start of the array, put it at the end for next time
                    if (leftOverData != 0)
                    {
                        Buffer.BlockCopy(buffer, 0, buffer, bufferSize, leftOverData);
                    }
                }
                if (leftOverData != 0)
                {
                    // At the start of the final buffer, we had the end of another character.
                    throw new InvalidDataException("Invalid UTF-8 data at start of stream");
                }
                if (firstYield && string.IsNullOrEmpty(previousEnd))
                {
                    yield break;
                }
                yield return previousEnd ?? "";
            }
            finally
            {
                stream.Dispose();
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}
 
 
// StreamUtil.cs:
public static class StreamUtil
{
    public static void ReadExactly(Stream input, byte[] buffer, int bytesToRead)
    {
        int index = 0;
        while (index < bytesToRead)
        {
            int read = input.Read(buffer, index, bytesToRead - index);
            if (read == 0)
            {
                throw new EndOfStreamException
                    (String.Format("End of stream reached with {0} byte{1} left to read.",
                                   bytesToRead - index,
                                   bytesToRead - index == 1 ? "s" : ""));
            }
            index += read;
        }
    }
}
0
 Аватар для Aumi
20 / 36 / 14
Регистрация: 08.10.2015
Сообщений: 406
08.11.2017, 12:06
попробуй так, но не гарантирую, что ошибок не будет
C#
1
2
3
4
5
6
7
8
9
string[] readText = System.IO.File.ReadAllLines(@"text.txt");
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"text.txt", false))
                {
                    for (int i = 0; i <= readText.Length; i++)
                    {
                           if (i == readText.Length)
                            MessageBox.Show(readText[i]);
                    }
                }
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
08.11.2017, 12:44

Не по теме:

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Количества слез, пролитого нормальными программистами при работе с чужим кодом, состоящим только из "очевидных" и, находящихся на первых строках результата поиска решений, хватит на over9000 всемирных потопов
Woldemar89, можно поинтересоваться чем по Вашему мнению плох ReadAllLines? Если не планируется считывать гигабайтные файлы, то данное решение, на мой взгляд, более чем оправдано. Или Вы вообще про "очевидные решения"?
Хотя, немного исправлю себя - лучше, в данном случае, использовать ReadLines(), а не ReadAllLines().



Добавлено через 2 минуты

Не по теме:

Aumi, что то Вы совсем перемудрили! :)

0
08.11.2017, 13:16

Не по теме:

Цитата Сообщение от Shogun31337 Посмотреть сообщение
Woldemar89, можно поинтересоваться чем по Вашему мнению плох ReadAllLines? Если не планируется считывать гигабайтные файлы, то данное решение, на мой взгляд, более чем оправдано.
Цитата Сообщение от Крок Посмотреть сообщение
Мне нужно в строку считать только последнюю строку.
А я ТЗ буквально понимаю :)

Цитата Сообщение от Shogun31337 Посмотреть сообщение
Или Вы вообще про "очевидные решения"?
Вообще, - потому что брать и применять 1й попавшийся\пришедший в голову способ, не обозрев другие - плохой подход.

Цитата Сообщение от Shogun31337 Посмотреть сообщение
Хотя, немного исправлю себя - лучше, в данном случае, использовать ReadLines(), а не ReadAllLines().
Да можно, но, тогда уж и я поправлю :)
ReadLines().Reverse() - возможно да, - это будет оптимально, однако я не искал инфы по перфомансу этой шняги (а вдруг там *опа) и решил положится на ответ авторитета (Jon Skeet)

0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
08.11.2017, 13:46
А если тупо прочитать файл построчно в какой-нибудь список и тупо взять последний элемент ?
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
08.11.2017, 13:49
Цитата Сообщение от Почтальон Посмотреть сообщение
А если тупо прочитать файл построчно в какой-нибудь список и тупо взять последний элемент ?
Это уже было в Симпсонах
0
08.11.2017, 14:05

Не по теме:

Цитата Сообщение от Woldemar89 Посмотреть сообщение
А я ТЗ буквально понимаю
Это аргумент! :)

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Вообще, - потому что брать и применять 1й попавшийся\пришедший в голову способ, не обозрев другие - плохой подход.
Согласен на 1000%!

Цитата Сообщение от Woldemar89 Посмотреть сообщение
ReadLines().Reverse()
А вот тут не понял... Зачем реверс, если Last() берет последнюю строку? Я, конечно, не уверен, но, думаю, что пройти по коллекции вперед до конца быстрее, нежели реверсить ее и потом брать первый элемент...

0
08.11.2017, 16:54

Не по теме:


Цитата Сообщение от Shogun31337 Посмотреть сообщение
А вот тут не понял... Зачем реверс, если Last() берет последнюю строку? Я, конечно, не уверен, но, думаю, что пройти по коллекции вперед до конца быстрее, нежели реверсить ее и потом брать первый элемент...
Тут Вы правы, хоть и не уверены :) - эта дрянь еще и у меня с OutOfMemory вылетает.
При использовании Reverse потребление памяти растет астрономически.
Last на реально мощном ноуте выдает посл. строку 1,5ГБ файла за 10 сек при стабильно малом потреблении памяти около 14мб
(стоит ссд, но тестил на втором 5400rpm hdd)

Тест
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var filename = "1.txt";
 
            if (!File.Exists(filename))
            {
                Console.WriteLine($"Generating big file...");
                var text = Enumerable.Repeat("line", int.MaxValue / 8);
                File.WriteAllLines(filename, text);
            }
 
            Stopwatch sw = new Stopwatch();
 
            sw.Restart();
            var lines = File.ReadLines(filename);
            sw.Stop();
            Console.WriteLine($"Direct query created in {sw.ElapsedMilliseconds} msec..");
 
            sw.Restart();
            var lines_reversed = File.ReadLines("1.txt").Reverse();
            sw.Stop();
            Console.WriteLine($"Reversed query created in {sw.ElapsedMilliseconds} msec..");
 
            sw.Restart();
            var last = lines.Last();
            sw.Stop();
            Console.WriteLine($"'{last}' extracted by 'Last()' in {sw.ElapsedMilliseconds} msec..");
 
            sw.Restart();
            var last_reversed = lines_reversed.First();
            sw.Stop();
            Console.WriteLine($"'{last_reversed}' extracted by 'Reverse().First()' in {sw.ElapsedMilliseconds} msec..");            
 
            Console.ReadKey();            
        }
    }
}


По поводу Reverse - это было "логичное" предположение идти с конца, но я не в курсе был что Reverse отожрет память.
О чем собственно, подстраховался.
Цитата Сообщение от Woldemar89 Посмотреть сообщение
ReadLines().Reverse() - возможно да, - это будет оптимально, однако я не искал инфы по перфомансу этой шняги (а вдруг там *опа) и решил положится на ответ авторитета (Jon Skeet)
В итоге:
Конкретно для этой задачи, - наверняка пофигу(сразу понятно было), что юзать, для других - 10 и более секунд может быть критично (да и там скорее БД будет лучше).
Так же можно проверить перфоманс MiscUtils.

пс
Цитата Сообщение от Shogun31337 Посмотреть сообщение
что пройти
"Пройти" - все-таки еще и "читать" включает.
Цитата Сообщение от Shogun31337 Посмотреть сообщение
по коллекции
Никогда не рассматривайте IEnumerable<> как коллекцию, не забывайте про отложенное выполнение
Также в коде выше можете посмотреть время создания запросов.
Еще, например для List<> Last() имеет сложность O(1) тк там будет выполнено
C#
1
var last = list[list.Count - 1];
когда в данном случае все совсем не так и очевидно сложность будет O(n).

0
08.11.2017, 19:21

Не по теме:

Цитата Сообщение от Woldemar89 Посмотреть сообщение
но я не в курсе был что Reverse отожрет память
ну я тоже не был уверен, просто по логике, иначе и быть не должно...

Цитата Сообщение от Woldemar89 Посмотреть сообщение
"Пройти" - все-таки еще и "читать" включает.
Да, это понятно. Про "пройти" я упрощенно сказал с мыслью о том, что все дискутирующие стороны в курсе. :)

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Никогда не рассматривайте IEnumerable<> как коллекцию, не забывайте про отложенное выполнение
Да, про отложенное выполнение я знаю (собственно, поэтому я и поправился, предложив использовать ReadLines, а не ReadAllLines). Просто IEnumerable все таки входит в пространство имен Collection. Так что, думаю, со спокойной душой можно называть это коллекцией. Да и, опять же, по логике причислить его к какому то иному типу тоже язык не поворачивается. Коллекция, просто со своими нюансами. Впрочем, как и любые другие типы коллекций.

Цитата Сообщение от Woldemar89 Посмотреть сообщение
для других - 10 и более секунд может быть критично
Читал на одном форуме тоже спор по поводу использования разных методов для чтения из файла. Там стояла задача сосчитать количество строк. Было предложено 3 варианта: 1. ReadLines, 2. побайтовое чтение из файла и проверка на символ переноса строки. 3. А вот третий не помню. В общем, смысл в том, что один из спорящих заморочился и провел тестирование этих методов. По итогу оказалось, что ReadLines самый быстрый, хотя памяти при этом потребляет значительно больше. Побайтовое чтение, соответственно, самым медленным, но память практически не расходовал. Точные цифры сказать не могу, тупо не помню.

0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
08.11.2017, 19:29
Цитата Сообщение от Shogun31337 Посмотреть сообщение
Читал на одном форуме тоже спор по поводу использования разных методов для чтения из файла. Там стояла задача сосчитать количество строк. Было предложено 3 варианта: 1. ReadLines, 2. побайтовое чтение из файла и проверка на символ переноса строки. 3. А вот третий не помню. В общем, смысл в том, что один из спорящих заморочился и провел тестирование этих методов. По итогу оказалось, что ReadLines самый быстрый, хотя памяти при этом потребляет значительно больше. Побайтовое чтение, соответственно, самым медленным, но память практически не расходовал. Точные цифры сказать не могу, тупо не помню.
Я бы не стал доверять "тестам" человека, для которого не очевидно, что вычитывать весь файл в массив объектов-строк для того, чтобы просто взять последнюю - это норм.

Читать содержимое файла тоже можно по-разному.

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

Shogun31337, ваш вариант хорош только тем, что краток. Но он ниразу не эффективен, только бездумен. Такое можно использовать только в личных целях и молча, чтобы никто не видел, но советовать другим - откровенно вредить. Нуб не может отличить где что, хрень вы посоветовали или нет. Он возьмёт тот совет, что выглядит проще. Это потом уже, ему на собеседовании скажут, что он на фиг не нужен в роли программиста, когда начнёт демонстрировать подобные "навыки".
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
08.11.2017, 19:58

Не по теме:

Цитата Сообщение от Shogun31337 Посмотреть сообщение
Так что, думаю, со спокойной душой можно называть это коллекцией. Да и, опять же, по логике причислить его к какому то иному типу тоже язык не поворачивается.
Нет, нельзя :)
Это интерфейс :)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public interface IEnumerable
    {
        // Interfaces are not serializable
        // Returns an IEnumerator for this enumerable Object.  The enumerator provides
        // a simple way to access all the contents of a collection.
        [Pure]
        [DispId(-4)]
        IEnumerator GetEnumerator();
    }
    
    public interface IEnumerable<out T> : IEnumerable
    {
        // Returns an IEnumerator for this enumerable Object.  The enumerator provides
        // a simple way to access all the contents of a collection.
        /// <include file='doc\IEnumerable.uex' path='docs/doc[@for="IEnumerable.GetEnumerator"]/*' />
        new IEnumerator<T> GetEnumerator();
    }
Итератором же, например, называется метод, возвращающий IEnumerable,
Например, тот же ReadLines
C#
1
2
3
4
    public IEnumerable MyIterator(...) 
    {  
      yield return ...
    }
Не сочтите за зануду, - но, ящитаю, что, если не называть вещи своими именами - есть риск набыдлокодить :)


Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Я предложил самый эффективный вариант. Но и его изговнять можно, если читать файл по-байтово, а не блоками по несколько килобайт.
Таки да Плюс кодировку файла нужно учитывать при побайтовом чтении.
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
08.11.2017, 20:05
Цитата Сообщение от Usaga Посмотреть сообщение
Я бы не стал доверять "тестам" человека, для которого не очевидно, что вычитывать весь файл в массив объектов-строк для того, чтобы просто взять последнюю - это норм.
Я не "доверяю" или "не доверяю". Я просто пересказал историю и все. Как говорится, за что купил, за то и продал. Кому интересно, тот может проверить самостоятельно. Ну и, повторюсь, у них была несколько иная задача. Так что без чтения всего файла полностью, насколько я понимаю, было все равно не обойтись.

Цитата Сообщение от Usaga Посмотреть сообщение
Я предложил самый эффективный вариант
С точки зрения производительности, согласен с Вами на 100%!

Цитата Сообщение от Usaga Посмотреть сообщение
ваш вариант хорош только тем, что краток.
Так я это сказал с самого начала. И даже не пытался оспаривать этот факт.

Цитата Сообщение от Usaga Посмотреть сообщение
Но он ниразу не эффективен, только бездумен.
Смотря что понимать под эффективностью. С точки зрения производительности, не эффективен! Согласен!

Цитата Сообщение от Usaga Посмотреть сообщение
Это потом уже, ему на собеседовании скажут, что он на фиг не нужен в роли программиста, когда начнёт демонстрировать подобные "навыки".
А вот тут не соглашусь. На мой взгляд, важно, чтобы программист мог решить одну и ту же задачу несколькими способами и мог решить в какой ситуации какой из методов будет более оптимальным. В частности, если не стоят жесткие требования к производительности, то почему бы не использовать метод менее производительный, зато на порядки быстрее в реализации? И раз уж зашел разговор о собеседовании, то встает вопрос - согласится ли работодатель оплачивать время, потраченное на решение задачи, на решение которой нужно 2 секунды (повторюсь, при условии, что о производительности речи не идет)? В конце концов, сейчас мало встретишь программистов на асме, хотя по Вашей логике, только на нем и нужно программировать!
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
08.11.2017, 20:05
пс - тот же ReadLines - итератор

C#
1
2
3
4
5
6
7
8
9
10
        public static IEnumerable<String> ReadLines(String path)
        {
            if (path == null)
                throw new ArgumentNullException("path");
            if (path.Length == 0)
                throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"), "path");
            Contract.EndContractBlock();
 
            return ReadLinesIterator.CreateIterator(path, Encoding.UTF8);
        }
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
08.11.2017, 20:13
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Это интерфейс
Да, я в курсе, что это интерфейс. Но то что он входит в пространство имен коллекций Вы же не будете спорить?

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Не сочтите за зануду, - но, ящитаю, что, если не называть вещи своими именами - есть риск набыдлокодить
Даже не смотрел на этот вопрос с такой точки зрения! Будем считать, что Вы меня убедили! Хотя, я особо то и не спорил. Просто несколько абстрактно выразился.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2017, 20:13
Помогаю со студенческими работами здесь

считать только последнюю строку из файла не обрабатывая другие
Можно как-то считать только последнюю строку из файла не обрабатывая другие...то-есть просто как-то поместить указатель в конце файла и...

Из текстового файла считать вторую строку и последнюю. Записать их в другой текстовой файл
Из текстового файла считать вторую строку и последнюю. Записать их в другой текстовой файл. Прошу помочь в написании программы. Буду...

Дан текстовый файл. Вставить в начало файла его последнюю строку, а в конец первую строку.
Помогите решить задание, заранее спасибо. Дан текстовый файл. Вставить в начало файла его последнюю строку, а в конец первую строку.

Считать с файла (input.txt) строку, перевернуть строку, записать файл (put.txt) эту строку
Считать с файла (input.txt) строку, перевернуть строку, записать файл (put.txt) эту строку.

Взять последнюю строку из файла
Я новичок! (не яд). Короче, у меня есть текстовый файл очень большого объема (36,6 Мб) и мне нужно взять из него только последнюю строку....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru