Перейти к содержимому

Как построчно считать файл в c

  • автор:

Чтение текстового файла построчно на C#

Два самых простых способа как прочитать текстовый файл построчно на C#. В обоих случаях используется using System.IO;. Напишу сразу примеры кода без всяких прелюдий.

Способ 1

Классический вариант чтения файла построчно:

StreamReader f = new StreamReader("test.txt"); while (!f.EndOfStream) < string s = f.ReadLine(); // что-нибудь делаем с прочитанной строкой s >f.Close();

Еще один пример, как можно организовать цикл построчного чтения:

string s; StreamReader f = new StreamReader("test.txt"); while ((s = f.ReadLine()) != null) < // что-нибудь делаем с прочитанной строкой s >f.Close();

Указать кодировку при чтении файла (например, DOS-кодировку) можно так:

StreamReader f = new StreamReader("test.txt", Encoding.GetEncoding(866));

Так же можно использовать обёртку using чтобы не закрывать файл после чтения.

string s; using (var f = new StreamReader("test.txt", Encoding.GetEncoding(1251))) < while ((s = f.ReadLine()) != null) < // что-нибудь делаем с прочитанной строкой s >>

Способ 2

Прочитать весь файл целиком в массив строк:

string[] lines = File.ReadAllLines("test.txt"); foreach (string s in lines) < // что-нибудь делаем с прочитанной строкой s >

По аналогии, кстати, можно и записывать построчно в файл, использовав StreamWriter, f.WriteLine и File.WriteAllLines. Побробнее смотрите в следующей статье.

Чтение файла построчно

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

Отслеживать
9,375 7 7 золотых знаков 24 24 серебряных знака 57 57 бронзовых знаков
задан 6 окт 2013 в 6:48
Никола Кривошея Никола Кривошея
1,497 4 4 золотых знака 34 34 серебряных знака 72 72 бронзовых знака
Смотрите метод getline() Например: std::string name; std::getline (std::cin,name);
6 окт 2013 в 6:56

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

вот код не вырванный из контекста

#include #include // подключаем строки #include // подключаем файлы using namespace std; // используем стандартное пространство имен int main() < string s; // сюда будем класть считанные строки ifstream file("C:\\PriceList.dat"); // файл из которого читаем (для линукс путь будет выглядеть по другому) while(getline(file, s))< // пока не достигнут конец файла класть очередную строку в переменную (s) cout file.close(); // обязательно закрываем файл что бы не повредить его return 0; > 

Отслеживать
ответ дан 1 авг 2015 в 11:01
10k 14 14 золотых знаков 53 53 серебряных знака 118 118 бронзовых знаков

Ээээ. А вы уверены насчёт eof ? Если я не ошибаюсь, eof для istream ‘ов возвращает true не когда поток находится в конце файла, а когда поток находится в конце файла, и предыдущая попытка чтения из-за этого завершилась неудачно.

1 авг 2015 в 11:08

если честно я сам не уверен, насколько я понимаю при считывании очередной строки указатель сдвигается на конец этой строки. давно не кодил но пример отлично отрабатывает без ошибок. а вот сдесь cplusplus.com/forum/beginner/11304 тоже похожий код указан

Как построчно считать файл в c

1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Модераторы: ElcnU
‘> чтение из файла построчно , прочитать файл с неизвестным кол-вом строк и неизв

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

Сообщ. #1 , 16.03.05, 10:57
Рейтинг (т): 2

есть файл открываю его с помощью fopen(fullfilename, «r+»))

как прочитать его по строчно причем кол-во строк неизвестно кол-во символов в строке тоже, так что функция fgets() отпадает если же пытаюсь исполсовать getline напромер как сдесь то компилятор выдает то что я использую неправильные аргументы какие именно не говарит

Сообщ. #2 , 16.03.05, 11:29
Рейтинг (т): 24
FILE* pfile = fopen( filepath, «r» );
if( pfile != NULL )
char buf[ 255 ];
while( !feof( pfile ) )
if( fscanf( pfile, «%[^\n]», buf ) != NULL )
//прочитана строка и лежит в buf
fscanf( pfile, «%h», &h );
fclose( pfile );
Сообщение отредактировано: bugger — 16.03.05, 11:32
Сообщ. #3 , 16.03.05, 12:18
Full Member
Рейтинг (т): 7
Цитата Grigor @ 16.03.05, 10:57
кол-во строк неизвестно кол-во символов в строке тоже, так что функция fgets() отпадает

почему сразу отпадает?
выдели пару килобайт, или мегабайт, 2Гб в твоём рапоряжении,а ты жмёшься
где ты такой текстовый файл найдёшь, где строка переваливает за килобайт?

Сообщ. #4 , 16.03.05, 12:27
Unregistered

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

Сообщ. #5 , 16.03.05, 12:36
Рейтинг (т): 2

Grigor, код в студию+полный текст ошибки

Lucifer ощибка была такой
Eroor error C3861: ‘getline’: Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden (если по немецки не
знаеш посмотри что значит код ошибки в любимом MSDN)

FILE* pfile = fopen( filepath, «r» );
if( pfile != NULL )
char buf[ 255 ];
while( !feof( pfile ) )
if( fscanf( pfile, «%[^\n]», buf ) != NULL )
//прочитана строка и лежит в buf
fscanf( pfile, «%h», &h );
fclose( pfile );

уау bugger так все просто окасалось

P.S все бы так просто было

Сообщение отредактировано: ViGOur — 16.03.05, 14:18
Сообщ. #6 , 16.03.05, 13:08
Рейтинг (т): 2

почему сразу отпадает?
выдели пару килобайт, или мегабайт, 2Гб в твоём рапоряжении,а ты жмёшься
где ты такой текстовый файл найдёшь, где строка переваливает за килобайт?

да это верно но хочется быть уверенным что ничего не потеряется хоть при каких размерах и какие они не важно 1KB или 1 GB

вот эта ошибка.
http://msdn.microsoft.com/library/default. rErrorC3861.asp
Подозреваю просто описался(вместо buf написал baf и т.п.)

описАлся это врятли вроде все переменные были скопированы с того места где обявлял но компилятор ругался, хотя
сейчас уже не проверищ код уже переписан

Сообщ. #7 , 16.03.05, 13:50
Full Member
Рейтинг (т): 7

cqwerty, если бы файл был не текстовый речь не шла бы о текстовых функциях, ими не читают бинарные файлы, что приводит конкретно к потере данных

Grigor, что-то я тогда не понимаю суть вопроса
чем отличается вариант с fscanf, который тебя устроил и где выделяется буферок в 255 байт, от варианта с функцией fgets?

а проверить потерю данных для fgets можно проверкой символа перед первым нулём в буфере(исключая последнюю строку)

if(buf[strlen(buf)-1]!=’\n’)

вот и всё
после обработки всего файла можно сравнить всё что прочиталось с размером файла

даёшь fgets.

Как прочитать файл построчно?

Возможно ли с помощью API прочитать файл построчно? Я кроме ReadFile и ReadFileEx ничего что-то больше не нашел. Неужели придется как-то ухищряться чтобы это сделать?

8 ответов

15 июля 2006 года
191 / / 15.07.2006

В Windows API точно нет функции для построчного чтения файлов. Если вы используете API, зачем вам такой примитив, как построчное чтение? И какой тип переменной или массив вы собираетесь использовать для хранения этих строк?

16 июля 2006 года
1.6K / / 18.09.2005

Есть некий текстовый файл, каждую строку которого нужно сравнить с эталонной. Может есть какие соображения по этому поводу?

16 июля 2006 года
8 / / 15.07.2006

[QUOTE=kosfiz]Есть некий текстовый файл, каждую строку которого нужно сравнить с эталонной. Может есть какие соображения по этому поводу?[/QUOTE]

читаешь весь файл, сплитишь его по энтеру и сравниваешь

17 июля 2006 года
122 / / 22.09.2005

Функция ReadFile() читает столько байт, сколько ей укажут — читай по-байтно и ищи символ окончания строки.

17 июля 2006 года
3 / / 17.07.2006
Да на кой тебе АПИ для таких целей
stdio была,есть и будет:

😉
Если переживаешь за скорость, то набей асм-вставку
17 июля 2006 года
4.8K / / 20.01.2000
[QUOTE=forker]Да на кой тебе АПИ для таких целей
stdio была,есть и будет:

😉
Если переживаешь за скорость, то набей асм-вставку[/QUOTE]
Странная функция. 😀

А чем тогда не подошла std, с её уже готовой getline ?

18 июля 2006 года
3 / / 17.07.2006
2Green:
ну извиняйте 🙂
честно скажу, что не приходилось её использовать, поэтому и не вспомнил
18 июля 2006 года
2.5K / / 14.07.2006

[QUOTE=Host]Функция ReadFile() читает столько байт, сколько ей укажут — читай по-байтно и ищи символ окончания строки.[/QUOTE]
Побайтно нехорошо читать — медленно сильно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *