Description : В файле input.txt записана информация из нескольких текстовых строк. Выводим содержимое этого файла на экран, посчитаем количество строк в файле.
#include <stdio.h>
#include <stdlib.h>
#define FNAME "input.txt" // имя исходного файла
int main( void ) {
// пробуем открыть файл для чтения
FILE* in = fopen( FNAME, "r" );
// обрабатываем ошибку открытия файла
if ( in == NULL ) {
perror( "Ошибка при открытии исходного файла" );
return EXIT_FAILURE;
}
size_t counter = 0; // предполагаем, что строк ноль в файле - т.е. пустой
int ch, pre = EOF; // текущий символ, последний считаный символ
printf( "%s %s\n", "Содержимое файла", FNAME );
// в цикле считаем сколько переводов строки в файле и запоминаем это в переменную counter
// а также выводим на экран каждый считаный символ.
// если файл пустой, то тело цикла не выполнится ни разу, так как первый считанный символ будет как раз EOF
// и в pre останется EOF
while ( ( ch = fgetc( in ) ) != EOF ) { // в цикле проходим весь файл посимвольно
pre = ch; // запоминаем последний считаный символ
if ( ch == '\n' ) // если нашли перевод строки,
++counter; // то увеличиваем счетчик строк
putchar( ch ); // выводим очередной символ на экран
}
// весь смысл переменной pre в том, чтобы запомнить какой символ мы считали перед тем как наткнулись на EOF в файле
// или в pre будет EOF - если тело цикла ни разу не выполнилось, это будет при пустом файле
// последняя строка файла может заканчиваться не \n, а строку посчитать надо - вот для этого и нужна переменная pre.
if ( pre == EOF ) // если файл пустой
puts( "Файл пустой!" ); // информация об этом.
else if ( pre != '\n' ) { // pre содержит в себе не перевод строки, и файл не пустой.
++counter; // увеличиваем
puts( "" );
}
puts( "" );
// выводим на экран информацию о количестве строк
printf( "%s %s %d", "строк в файле", FNAME, counter );
return EXIT_SUCCESS;
Объяснение:
Сейчас решаем такую же задачу, только на олимпиаде, вроде так.
Program pr3; Var A : array [1..100, 1..100] of integer ; {резервирование памяти под массивы} B : array [1..100, 1..100] of integer ; C : array [1..100, 1..100] of integer ; m, n, i,j: integer ; {переменные i,j вводятся как индексы массива} Begin randomize; writeln ('Введите размерность матриц m и n (числа <100)'); readln (m, n); For i:=1 to m do For j:=1 to n do begin A[i,j]:=random (20)-10; {ввод элемента матрицы} B[i,j]:=random (20)-10; {ввод элемента матрицы} end; writeln ('Итоговая матрица A: '); For i:=1 to m do begin For j:=1 to n do write (A[i,j], ' '); {вывод элементов производится в виде матрицы } writeln; {после перебора всех столбцов одной строки – переход новую строку} end; writeln; writeln ('Итоговая матрица B: '); For i:=1 to m do begin For j:=1 to n do write (B[i,j], ' '); {вывод элементов производится в виде матрицы } writeln; {после перебора всех столбцов одной строки – переход новую строку} end; writeln; For i:=1 to m do {цикл по всем строкам матрицы} For j:=1 to n do {цикл по всем столбцам матрицы} if (A[i,j] < B[i,j]) then C[i,j] := B[i,j] else C[i,j] := A[i,j]; writeln ('Итоговая матрица C: '); For i:=1 to m do begin For j:=1 to n do write (C[i,j], ' '); {вывод элементов производится в виде матрицы } writeln; {после перебора всех столбцов одной строки – переход новую строку} end; end.
Const n=20; var a:array[1..n] of integer; i,i1,i2,x:integer; begin Randomize; a[1]:=random(10); write(a[1],' '); for i:=2 to n do begin a[i]:=a[i-1]+random(10); write(a[i],' '); end; writeln; write('x = '); readln(x); i1:=1; i2:=n; repeat i:=(i1+i2) div 2; if a[i]<x then i1:=(i1+i2) div 2+1; if a[i]>x then i2:=(i1+i2) div 2-1; until (a[i]=x)or(i1>i2); if a[i]=x then begin writeln('Искомый(ые) номер(а) элемента(ов):'); while (i>0)and(a[i]=x) do i:=i-1; i:=i+1; while (i<=n)and(a[i]=x) do begin write(i,' '); i:=i+1; end; end else writeln('Элемент не найден'); writeln; end.
Name : c_file_row_count.c
Author : UranFlex
Version : 0.1 alpha
Copyright : GNU GPL
Description : В файле input.txt записана информация из нескольких текстовых строк. Выводим содержимое этого файла на экран, посчитаем количество строк в файле.
#include <stdio.h>
#include <stdlib.h>
#define FNAME "input.txt" // имя исходного файла
int main( void ) {
// пробуем открыть файл для чтения
FILE* in = fopen( FNAME, "r" );
// обрабатываем ошибку открытия файла
if ( in == NULL ) {
perror( "Ошибка при открытии исходного файла" );
return EXIT_FAILURE;
}
size_t counter = 0; // предполагаем, что строк ноль в файле - т.е. пустой
int ch, pre = EOF; // текущий символ, последний считаный символ
printf( "%s %s\n", "Содержимое файла", FNAME );
// в цикле считаем сколько переводов строки в файле и запоминаем это в переменную counter
// а также выводим на экран каждый считаный символ.
// если файл пустой, то тело цикла не выполнится ни разу, так как первый считанный символ будет как раз EOF
// и в pre останется EOF
while ( ( ch = fgetc( in ) ) != EOF ) { // в цикле проходим весь файл посимвольно
pre = ch; // запоминаем последний считаный символ
if ( ch == '\n' ) // если нашли перевод строки,
++counter; // то увеличиваем счетчик строк
putchar( ch ); // выводим очередной символ на экран
}
// весь смысл переменной pre в том, чтобы запомнить какой символ мы считали перед тем как наткнулись на EOF в файле
// или в pre будет EOF - если тело цикла ни разу не выполнилось, это будет при пустом файле
// последняя строка файла может заканчиваться не \n, а строку посчитать надо - вот для этого и нужна переменная pre.
if ( pre == EOF ) // если файл пустой
puts( "Файл пустой!" ); // информация об этом.
else if ( pre != '\n' ) { // pre содержит в себе не перевод строки, и файл не пустой.
++counter; // увеличиваем
puts( "" );
}
puts( "" );
// выводим на экран информацию о количестве строк
printf( "%s %s %d", "строк в файле", FNAME, counter );
return EXIT_SUCCESS;
Объяснение:
Сейчас решаем такую же задачу, только на олимпиаде, вроде так.