Как построчно считать файл в c
При работе с текстовыми файлами граздо проще работать с данными не как с отдельными символами, а как со строками с помощью функций fgets() и fputs() .
Запись текстового файла
Функция fputs() записывает в файл строку, то есть набор символов, который завершается символом ‘\0’. Она имеет следующий прототип:
int fputs(const char *s, FILE *stream);
Первый параметр функции — записываемая строка, а второй — указатель на файловый поток. В качестве результата функция возвращает неотрицательное целое число. При ошибках в процессе записи возвращается значение EOF .
При записи строки нулевой символ ‘\0’ в файл не записывается.
Например, запишем строку в файл:
#include int main(void) < // строка для записи char * message = "Hello METANIT.COM!\nAn apple a day keeps the doctor away"; // файл для записи char * filename = "data.txt"; // запись в файл FILE *fp = fopen(filename, "w"); if(fp) < // записываем строку fputs(message, fp); fclose(fp); printf("File has been written\n"); >>
Запись довольно проста: открываем файл на запись и с помощью вызова fputs(message, fp) записываем в файл искомую строку.
Чтение текстового файла
Функция fgets() считывает из файла одну строку и имеет следующий прототип:
char * fgets(char *s, int n, FILE *sream);
Первый параметр char *s представляет строку, в которую производится считывание. Второй параметр — число n указывает, сколько символов необходимо считывать. И третий параметр представляет файловый поток, из которого производится считывание.
При вызове функция считывает из файла не более n-1 символов. Функция прекращает чтение, когда прочтет n-1 символов или встретит символ переноса строки \n. Все считанные символы записываются в строку s, в том числе символ \n. И также конец каждой строки дописывается нулевой символ ‘\0’.
При успешном завершении функция возвращает указатель s , а при ошибке или достижении конца файла возвращается значение NULL .
Считаем данные из выше записанного файла «data.txt»:
#include int main(void) < // файл чтения char * filename = "data.txt"; // буфер для считавания данных из файла char buffer[256]; // чтение из файла FILE *fp = fopen(filename, "r"); if(fp) < // пока не дойдем до конца, считываем по 256 байт while((fgets(buffer, 256, fp))!=NULL) < printf("%s", buffer); >fclose(fp); > >
Здеcь открываем файл на чтение и в цикле считываем из файла по 256 символов и выводим их на консоль с помощью вызова fgets(cc, 256, fp) . Когда данные в файле закончатся, функция возвратит NULL, и произойдет выход из цикла.
Копирование файлов
Другой пример работы с текстовыми файлами — копирование содержимого из одного файла в другой:
#include int main(void) < char * filename1 = "data1.txt"; char * filename2 = "data2.txt"; char buffer[256]; FILE *f1 = fopen(filename1, "r"); // файл на чтение FILE *f2 = fopen(filename2, "w"); // файл на запись if(!f1 || !f2) < printf("Error occured while opening file\n"); >else < // пока не дойдем до конца, считываем по 256 байт из файла f1 while((fgets(buffer, 256, f1))!=NULL) < // записываем строку в файл f2 fputs(buffer, f2); printf("%s", buffer); >> fclose(f1); fclose(f2); return 0; >
Построчное чтение из файла
Построчное чтение из файла
Из файла нужно построчно считать числа типа double и записать в массив. Файл примерно выглядит.
Построчное чтение файла
Подскажите как читать файл построчно что бы работало примерно так сначала читается 1 строка из.

Построчное чтение из файла
Всем привет! Помогите написать функцию построчного вывода из файла. Условно, есть файл с таким.
Построчное чтение из файла
Необходимо построчно прочитать данные из файла, из разобрать их по переменным. Образец данных в.
Заблокирован
![]()
Сообщение от FolkAltair 
перед циклом t = 0; есть.
Добавлено через 1 минуту
Кстати как открыт файл в двоичном fopen(«path»,»rb»); или текстовом режиме fopen(«path»,»r») . Это важно!
Добавлено через 1 минуту
Сообщение от FolkAltair 
or (i=0; i<50; i++)
— стоп чисел в файле что 50. Ладно я уже пишу код.
Добавлено через 2 минуты
Вот код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include #include int main() { int val, sum = 0; FILE * f = fopen("data.txt","r"); if(!f) printf("Error open data.txt\n"); else { while(!feof(f)) { if(fscanf(f,"%d\n",&val)) if(val 0) sum += val; } fclose(f); printf("Sum of negative : %d\n",sum); } printf("Press any key to continue\n"); getch(); return 0; }
Заблокирован
![]()
-10
5
68
93
14
145
-61
3
-4
11
0
54
-3
Скрин работы
Заблокирован
![]()
Сообщение от -=ЮрА=- 
while(!feof(f))
— не зависимо сколько чисел в файле читаем пока не встретим конец файла
Сообщение от FolkAltair 
for (i=0; i <50; i++)
* * * * fscanf(fo,»%d\n»,&y);50;>
— так концептуально неверно строить алгоритм
Регистрация: 05.12.2011
Сообщений: 23
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
#include #include #include void main() { int i,n[50],sum,val; for (i=0; i50; i++) { n[i]=rand()%100-50; } FILE*fo; fo=fopen("chisla.txt","wt"); for (i=0; i50; i++) fprintf(fo, "%d\n",n[i]); fclose(fo); fo=fopen("chisla.txt", "r"); if(!fo) printf("Error open data.txt\n"); else { while(!feof(fo)) { if(fscanf(fo,"%d\n",&val)) if(val 0) sum += val; } fclose(fo); printf("Sum of negative : %d\n",sum); } getch(); }
Вот получившаяся программа, она компилица, но при запуске выдаёт ошибку, мол «sum» не инициализирован; да, перед тем как считать сумму нужно было ещё создать этот файл и заполнить
Заблокирован
![]()
Сообщение от FolkAltair 
мол «sum» не инициализирован;
— ну а где вы его инициализоровали. У меня инит здесь
Сообщение от -=ЮрА=- 
, а у Вас??)))
Вот так запишите
Сообщение от FolkAltair 
int i,n[50],sum,val;
int i,n[50], sum = 0 ,val; — и всё заработает
Добавлено через 5 минут
FolkAltair, ауууу.
Регистрация: 05.12.2011
Сообщений: 23
Спасибо, исправил, всё работает теперь)
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Построчное чтение файла в массив
доброго всем 🙂 своими силами изучаю C. Поставил себе задачу: Есть некий файл. Нужно читать его.
Построчное чтение данных из файла
Есть фаил: selulhmb 83 86 77 82 glrdos 54 48 3 35 canryx 15 59 5 26 cdqqri 45 0 66 37 bxdsj 49.
Построчное чтение из файла сделать оптимальнее
Есть вот такой код(linux, компилятор gcc), читающий файл построчно: void fun(. ) < .
Построчное чтение неопределенного количества чисел из файла
Здраствуйте. У меня программа построчно читает числа из файла в масив. Потом выполняется сортировка.
Построчное чтение из файла, заполнение структуры и запись в бинарный файл
Здравствуйте. Пытаюсь сделать чтение из текстового файла построчно, а затем сразу забиваю в.
Построчное считывание из файла
Сразу к сути вопроса — мне надо считать текст из файла(целиком), но текст может быть слишком.
Как построчно считать файл в c
Как прочитать построчно текстовый файл на C? fgets не устраивает тем, что нельзя определить, был ли достигнут конец строки, если строка не поместилась в буфер целиком, либо нужно каждый раз определять длину строки, чтобы проверить, является ли последний прочитанный символ символом \n, что существенно увеличивает накладные расходы (каждый раз после чтения вызывать strlen(), для моей задачи это критично). Есть ли аналогичная fgets() функция, но работающая по принципу «все или ничего»?
Re: Чтение файла построчно на С
| От: | Implaer | |
| Дата: | 18.01.11 21:30 | |
| Оценка: | -1 | |
Здравствуйте, Аноним, Вы писали:
А>Как прочитать построчно текстовый файл на C? fgets не устраивает тем, что нельзя определить, был ли достигнут конец строки, если строка не поместилась в буфер целиком, либо нужно каждый раз определять длину строки, чтобы проверить, является ли последний прочитанный символ символом \n, что существенно увеличивает накладные расходы (каждый раз после чтения вызывать strlen(), для моей задачи это критично). Есть ли аналогичная fgets() функция, но работающая по принципу «все или ничего»?
Re[2]: Чтение файла построчно на С
| От: | ArtDenis |
| Дата: | 19.01.11 06:48 |
| Оценка: |
Здравствуйте, Implaer, Вы писали:
I>while (fscanf(f,»%f»,&x)>0)
А каким образом это позволит считать текстовый файл построчно?
Re: Чтение файла построчно на С
| От: | Мишень-сан |
| Дата: | 19.01.11 07:50 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Как прочитать построчно текстовый файл на C? fgets не устраивает тем, что нельзя определить, был ли достигнут конец строки, если строка не поместилась в буфер целиком, либо нужно каждый раз определять длину строки, чтобы проверить, является ли последний прочитанный символ символом \n, что существенно увеличивает накладные расходы (каждый раз после чтения вызывать strlen(), для моей задачи это критично). Есть ли аналогичная fgets() функция, но работающая по принципу «все или ничего»?
В С нет.
Подозреваю, все делают следующим способом:
1. Поблочная вычитка файла
2. Как только в блоке натыкаемся на ‘\n’, считаем длину получившейся строки, выделяем буфер и сливаем туда вычитанные блоки, включая кусок из последнего до ‘\n’.
3. Вытираем из буфера все обработанные блоки, оставляя только «хвост» последнего
4. Переходим к п. 1
Re: Чтение файла построчно на С
| От: | Alexéy Sudáchen |
| Дата: | 19.01.11 08:40 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Как прочитать построчно текстовый файл на C? fgets не устраивает тем, что нельзя определить, был ли достигнут конец строки, если строка не поместилась в буфер целиком, либо нужно каждый раз определять длину строки, чтобы проверить, является ли последний прочитанный символ символом \n, что существенно увеличивает накладные расходы (каждый раз после чтения вызывать strlen(), для моей задачи это критично). Есть ли аналогичная fgets() функция, но работающая по принципу «все или ничего»?
Нафига strlen?! Вообще-то пишется сходу. Задачка уровня тривиального собеседования.
типа файл fgets.c
#include #include char *safe_fgets(FILE *f) < enum < step = 5 >; /* 128? 256? . set your own step here */ int R = step; int L = 0; char *s = malloc(step+1); s[0] = 0; s[R-1] = 0; for ( ;; ) < if ( !fgets(s+L,R-L+1,f) ) if ( feof(f) && s[0] ) return s; else < free(s); return 0; > if ( *(s+R-1) && *(s+R-1) != '\n' ) < s = realloc(s,R+step+1); L = R; R = R+step; s[R-1] = 0; >else return s; > > int main() < FILE *f = fopen("fgets.c","r"); char *s; while ( 0 != (s = safe_fgets(f)) ) < fputs(s,stderr); free(s); >fclose(f); return 0; >
Re[2]: Чтение файла построчно на С
| От: | igna |
| Дата: | 19.01.11 09:33 |
| Оценка: |
Здравствуйте, Alexéy Sudáchen, Вы писали:
AS>типа файл fgets.c
#include #include char *safe_fgets(FILE *f) < long pos = ftell(f); size_t len = 0; int c; while ( EOF != (c = getc(f)) && (++len, '\n' != c)) ; if ( len ) < char *s = malloc(len+1); fseek(f,pos,SEEK_SET); fread(s,1,len,f); s[len] = '\0'; return s; > else return 0; > int main() < FILE *f = fopen("fgets.c","r"); char *s; while ( 0 != (s = safe_fgets(f)) ) < fputs(s,stderr); free(s); >fclose(f); return 0; >
Re[3]: Чтение файла построчно на С
| От: | gegMOPO4 |
| Дата: | 19.01.11 13:01 |
| Оценка: |
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Alexéy Sudáchen, Вы писали:
AS>>типа файл fgets.c
I>Мой вариант:
А теперь для stdin продемонстрируйте.
Да и по скорости вариант с fgets наверняка быстрее будет (только увеличивать буфер не на фиксированный шаг нужно).
Re[3]: Чтение файла построчно на С
| От: | Alexéy Sudáchen |
| Дата: | 19.01.11 14:35 |
| Оценка: |
Здравствуйте, igna, Вы писали:
AS>>типа файл fgets.c
I>Мой вариант:
Тоже вариант. Но два момента: первый — как уже сказали выше, не всегда можно позиционироваться (например чтение с TCP сокета хидеров в HTTP-ответе); второй — чтение файла медленнее чем выделение памяти.
Re[4]: Чтение файла построчно на С
| От: | igna |
| Дата: | 19.01.11 15:19 |
| Оценка: |
Здравствуйте, Alexéy Sudáchen, Вы писали:
AS>Тоже вариант. Но два момента: первый — как уже сказали выше, не всегда можно позиционироваться (например чтение с TCP сокета хидеров в HTTP-ответе); второй — чтение файла медленнее чем выделение памяти.
Позиционироваться можно действительно не всегда, что есть — то есть. Но насчет медленнее — в общем случае не согласен, в случае нормальных файлов под Windows повторного чтения с диска не будет, второй раз чтение будет из кэша.
Re[2]: Чтение файла построчно на С
| От: | Tilir | http://tilir.livejournal.com |
| Дата: | 21.01.11 08:01 | |
| Оценка: |
Здравствуйте, Alexéy Sudáchen, Вы писали:
AS>Здравствуйте, Аноним, Вы писали:
А>>Как прочитать построчно текстовый файл на C? fgets не устраивает тем, что нельзя определить, был ли достигнут конец строки, если строка не поместилась в буфер целиком, либо нужно каждый раз определять длину строки, чтобы проверить, является ли последний прочитанный символ символом \n, что существенно увеличивает накладные расходы (каждый раз после чтения вызывать strlen(), для моей задачи это критично). Есть ли аналогичная fgets() функция, но работающая по принципу «все или ничего»?
AS>Нафига strlen?! Вообще-то пишется сходу. Задачка уровня тривиального собеседования.
Этот подход никуда не годится. Выделение памяти внутри fgets исключает возможность работы со статическим буфером и проверку его размера — то есть семантика вашей safe_fgets отличается от семантики fgets, а имя вводит в заблуждение. И, кстати, пользователю всё равно придётся в конце вызывать strlen чтобы определить сколько же вы ему вернули. Два байта? Килобайт? Четыре мегабайта? Это кстати даёт свободу некоторым интересным сценариям (особенно при сетевой работе приложения, так что зря вы употребили там слово «safe»).
Как я вижу основную проблему: чтобы сохранить семантику fgets нужно либо как igna сделать необоснованное предположение что мы можем позиционировать поток (что не так для исходной fgets => снова не решает задачу, а лишь маскирует уход от ответа) либо хранить где-то «хвосты» считанных и не понадобившихся буферов. Но в этом случае у нас во-первых требуется теоретически очень большое место в памяти, во-вторых мы должны как-то узнавать потоки, чтобы знать кому какой из сохранённых хвостов пришивать, а FILE*, как я понимаю не даёт, нам такой гарантии.
Что в общем случае наводит на мысль что задача не решаема — пользовательской программе всё равно придётся предпринимать некоторые нетривиальные действия при работе с fgets. Либо вручную контролировать «позиционируемость потока», либо вручную хранить неиспользованные недосчитанные хвосты.
Re[3]: Чтение файла построчно на С
| От: | Alexéy Sudáchen |
| Дата: | 21.01.11 10:08 |
| Оценка: |
Здравствуйте, Tilir, Вы писали:
T>Этот подход никуда не годится. Выделение памяти внутри fgets исключает возможность работы со статическим буфером и проверку его размера — то есть семантика вашей safe_fgets отличается от семантики fgets, а имя
Где-то в исходном топике было про семантику fgets?! Назовите функцию fdghgdf1 — что теперь задача решена? Для семантики fgets — нужно пользовать fgets, и не сношать мозг.
T>Что в общем случае наводит на мысль что задача не решаема — пользовательской программе всё равно придётся
Передать в функцию указатель на длину прочитанной строки руки отвалятся?
Re[2]: Чтение файла построчно на С
| От: | Kerbadun | |
| Дата: | 21.01.11 10:17 | |
| Оценка: | +1 | |
Здравствуйте, Alexéy Sudáchen, Вы писали:
AS>Нафига strlen?! Вообще-то пишется сходу. Задачка уровня тривиального собеседования.
AS>#include AS>#include AS>char *safe_fgets(FILE *f) AS> < AS>enum < step = 5 >; /* 128? 256? . set your own step here */ AS> int R = step; AS> int L = 0; AS> char *s = malloc(step+1); AS> s[0] = 0; AS> s[R-1] = 0; AS> for ( ;; ) AS> < AS>if ( !fgets(s+L,R-L+1,f) ) AS> if ( feof(f) && s[0] ) AS> return s; AS> else AS> < free(s); return 0; > AS> if ( *(s+R-1) && *(s+R-1) != '\n' ) AS> < AS>s = realloc(s,R+step+1); AS> L = R; AS> R = R+step; AS> s[R-1] = 0; AS> > AS> else AS> return s; AS> > AS> > AS>int main() AS> < AS>FILE *f = fopen("fgets.c","r"); AS> char *s; AS> while ( 0 != (s = safe_fgets(f)) ) AS> < AS>fputs(s,stderr); AS> free(s); AS> > AS> fclose(f); AS> return 0; AS> > AS>
Ну да, задачка уровня собеседования — проваленного собеседования.
За такой код на собеседовании сразу пинком под зад: он нечитаемый, неверифицируемый, опасный, переменные названы одной буквой. Решает элементарную задачу, но в нем сложно разобраться.
Когда он умрет, его мозг заспиртуют в стакане
Re[3]: Чтение файла построчно на С
| От: | Alexéy Sudáchen | |
| Дата: | 21.01.11 10:45 | |
| Оценка: | +1 | |
Здравствуйте, Kerbadun, Вы писали:
K>За такой код на собеседовании сразу пинком под зад: он нечитаемый, неверифицируемый, опасный, переменные названы одной буквой. Решает элементарную задачу, но в нем сложно разобраться.
Дык, напиши показательный пример — читаемый, верифицируемый, неопасный, с переменными названными длиннымПонятнымИменем. Ну и чтобы в нём было просто разабраться. Что бы это в твоём понимании не значило. В общем удовлетворяющий твоим критериям. Ты же аноним, чего те боятся то?
Про «Правильный Код» ™ каждый дурак рассуждать может. Кстати, это не моя проблема, то что кто-то не умеет читать код, и для него r,l заместо right, left — непреодолимое препятствие. Как собственно и незнание устройства сишной строки.
Re[3]: Чтение файла построчно на С
| От: | Alexéy Sudáchen |
| Дата: | 21.01.11 10:54 |
| Оценка: |
Здравствуйте, Tilir, Вы писали:
T>Что в общем случае наводит на мысль что задача не решаема — пользовательской программе всё равно придётся предпринимать некоторые нетривиальные действия при работе с fgets. Либо вручную контролировать «позиционируемость потока», либо вручную хранить неиспользованные недосчитанные хвосты.
В догонку. У топикстартера конкретная задача — прочитать файл построчно. Конкретная проблема, неизветсно какого размера нужен буффер, чтобы достоверно прочитать строку. Как результат нужно делать лишний strlen, именно для того, чтобы узнать прочитали всю строку или нет. Strlen там всё равно дальше нужно делать для обработки строки, и топикстартера это не смущает.
Собственно, задачу топикстартера мой код решает. То что он не решает сферическое в вакууме чтение из файла — дык, а зачем?! Он не для этого написан.
Re: Чтение файла построчно на С
| От: | Pavel Dvorkin | |
| Дата: | 21.01.11 11:16 | |
| Оценка: | 3 (1) | |
Здравствуйте, Аноним, Вы писали:
А>Как прочитать построчно текстовый файл на C? fgets не устраивает тем, что нельзя определить, был ли достигнут конец строки, если строка не поместилась в буфер целиком, либо нужно каждый раз определять длину строки, чтобы проверить, является ли последний прочитанный символ символом \n, что существенно увеличивает накладные расходы (каждый раз после чтения вызывать strlen(), для моей задачи это критично). Есть ли аналогичная fgets() функция, но работающая по принципу «все или ничего»?
Самое простое и элегантное решение (но при этом, увы, платформо-зависимое) для этой задачи заключается в том, чтобы файл не читать, буфера не выделять и не перевыделять и размеры их не рассчитывать. Все, что нужно, уже есть в файле, поэтому всего лишь надо спроецировать его в память, и задача практически решена!
int _tmain(int argc, _TCHAR* argv[]) < HANDLE hFile = CreateFile("D:\\a.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); int sizeChars = GetFileSize(hFile, NULL); HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); char* lpText = (char*) MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0); char* lpCurrent = lpText; while(lpCurrent - lpText < sizeChars ) < char* lpLineStart = lpCurrent; while (lpCurrent - lpText < sizeChars && *lpCurrent != 0xD) // первое условие увы, необходимо , так как в конце последней строки может не быть CR lpCurrent++; // lpLineStart - начало, (lpCurrent -1) - конец // отладочная печать for(char* p = lpLineStart; p < lpCurrent; p++) putchar(*p); putchar('\n'); // конец отладочной печати lpCurrent += 2; > UnmapViewOfFile(lpText); CloseHandle(hFileMapping); CloseHandle(hFile); return 0; >
With best regards
Pavel Dvorkin
Re[4]: Чтение файла построчно на С
| От: | Kerbadun | |
| Дата: | 21.01.11 11:16 | |
| Оценка: | +1 | |
Извиняюсь, я тут ударился головой об острый угол, был в плохом настроении, написал лишнего. Не обращай внимания.
Когда он умрет, его мозг заспиртуют в стакане
Re: Чтение файла построчно на С
| От: | Kerbadun |
| Дата: | 21.01.11 11:33 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Как прочитать построчно текстовый файл на C? fgets не устраивает тем, что нельзя определить, был ли достигнут конец строки, если строка не поместилась в буфер целиком, либо нужно каждый раз определять длину строки, чтобы проверить, является ли последний прочитанный символ символом \n, что существенно увеличивает накладные расходы (каждый раз после чтения вызывать strlen(), для моей задачи это критично). Есть ли аналогичная fgets() функция, но работающая по принципу «все или ничего»?
Ты тормозным fgets’ом читаешь текстовый файл и думаешь, что strlen что-то там замедлит?
Прежде чем делать такие серьезные выводы, рекомендую сначала померить профайлером, хотя бы.
На мой взгляд, strlen тормозить никак не должен, так как fgets должен несравнимо больше времени занимать.
Ты подумай: fgets же к диску обращается! Причем он внутри себя реализует некий не самый производительный алгоритм, который читает файл по строкам, хотя исходный файл-то бинарный.
По сравнению с этим одинокий strlen, один раз линейно сканирующий участок оперативной памяти, который, возможно, и так уже целиком сидит в кеше процессора — вообще ничто.
Вообще, читать файл fgets’ом — это далеко не лучшее решение в плане производительности.
Когда он умрет, его мозг заспиртуют в стакане
Re[4]: Чтение файла построчно на С
| От: | Tilir | http://tilir.livejournal.com |
| Дата: | 21.01.11 14:58 | |
| Оценка: |
Здравствуйте, Alexéy Sudáchen, Вы писали:
AS>Где-то в исходном топике было про семантику fgets?! Назовите функцию fdghgdf1 — что теперь задача решена? Для семантики fgets — нужно пользовать fgets, и не сношать мозг.
Прочитать файл построчно можно, кто бы спорил. Проблема поставленная топик-стартером сама по себе проста и неинтересна. Но он неявно сформулировал гораздо более интересную проблему — разработать такую реализацию процедуры считывания строки, которая придерживалась бы семантики fgets, но работала по принципу «всё или ничего» — то есть ничего не возвращала, если за заданную длину буфера конец строки не достигнут. Пока что лучшую попытку расколоть именно этот орешек сделал igna, но у него предполагается позиционирование итератора.
Re[5]: Чтение файла построчно на С
| От: | Alexéy Sudáchen |
| Дата: | 21.01.11 19:43 |
| Оценка: |
Здравствуйте, Tilir, Вы писали:
T>Прочитать файл построчно можно, кто бы спорил. Проблема поставленная топик-стартером сама по себе проста и неинтересна. Но он неявно сформулировал гораздо более интересную проблему — разработать такую реализацию процедуры считывания строки, которая придерживалась бы семантики fgets, но работала по принципу «всё или ничего» — то есть ничего не возвращала, если за заданную длину буфера конец строки не достигнут. Пока что лучшую попытку расколоть именно этот орешек сделал igna, но у него предполагается позиционирование итератора.
Ну для этого всего лишь нужен обЪект-буффер с динамическим размером. Делал я так — смысла нет. Ну как минимум для меня. С дескрипторными функциями смысл есть (и для них fgets надо самому писать), но там такой буффер и просто как буффер работает. На потоках же и так буфер уже есть.
Можно ещё с буфером потока помухлевать =) но это уже совсем чёрная магия.
Чтение текстового файла построчно на 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. Побробнее смотрите в следующей статье.