Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функция проверяет, является ли c




ФУНКЦИЯ ПРОВЕРЯЕТ, ЯВЛЯЕТСЯ ЛИ c

isalpha(c) буквой

isdigit(c) цифрой

islower(c) строчной буквой

isspace(c) пустым символом (пробел, табуляция или новая строка)

isupper(c) прописной буквой

 

Ваша система может иметь дополнительные функции, такие как

isalnum(c) алфавитно-цифровым (буква или цифра)

isascii(c) кодом ASCII (0—127)

iscntrl(c) управляющим символом

ispunct(c) знаком пунктуации

 

Еще две функции выполняют преобразования:

 

toupper(c) преобразует с в прописную букву

tolower(c) преобразует с в строчную букву

 

В некоторых системах преобразование выполняется только в случае, если символ находится в регистре (прописных или строчных букв), противоположном тому, с которого следует начинать. Однако надежнее предварительно проверить регистр.

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

 

/* преобразование строчных букв в прописные и обратно */

#include <stdio.h>

#include < ctype.h> /* включает файл макроопределений */

#define. UPPER 1

#define LOWER 0

main()

{

int crit; /* для установки регистра прописных или строчных букв */

char file1[14], file2[14]; /* имена входного и выходного файлов */

crit = choose(); /* выбирает прописные или строчные буквы */

getfiles(file1, file2); /* получает имена файлов */

conv(file1, file2, crit); /* выполняет преобразование */

}

 

choose()

{

int ch;

printf(" Программа преобразует весь файл в прописные буквы или \n");

printf(" в строчные буквы. Вводит U, если нужны прописные буквы\n");

printf(" или вводит L, если нужны строчные буквы.\n");

while ((ch = getchar())!= 'U' && ch!= 'u' && ch! = 'L' && ch!='!')

printf(" Введите, пожайлуста, U или L.\n");

while (getchar()!= '\n')

; /* сбрасывает последний символ новой строки */

if (ch == 'U' || ch == 'u')

{

printf(" Все в порядке, есть регистр прописных букв.");

return(UPPER);

}

else

{

printf(" Все в порядке, есть регистр строчных букв.");

return(LOWER);

}

}

 

getfiles(name1, name2);

char *name1, name2;

{

printf(" Какой файл вы хотите преобразовать? \n");

gets(name1);

printf(" Это\" %s\" \n", name1);

printf(" Какое имя вы хотите выбрать для преобразуемого файла? \n");

while (strcmp(gets(name2), name1) == NULL)

printf(" Выберите другое имя\n");

printf(" Ваш выходной файл\" %s\" \n", name2);

}

 

conv(name1, name2, crit)

char *name1, name2;

int crit;

{

int ch;

FILE *f1, *f2;

if ((f1 = fopen(name1, "r")) == NULL)

printf("Извините, я не могу открыть %s. До свидания.\n", name1);

else

{

puts(" Итак, начнем!");

f2 = fopen(name2, "w");

while ((ch = getc(f1))!= EOF)

{

if (crit == UPPER)

ch = islower(ch)? toupper(ch): ch;

else

ch = isupper(ch)? tolower(ch): ch;

putc(ch, f2);

}

fclose(f2);

fclose(f1);

puts(" Сделано!");

}

}

 

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

Функция choose() довольно проста за исключением, может быть, цикла

 

while(getchar()! = ' \n')

;

 

Этот цикл включен для решения проблемы, с которой мы столкнулись раньше. Когда пользователь отвечает на вопрос о виде преобразования, скажем, буквой U, он нажимает клавишу U, а затем клавишу [ввод], которая передает ' \n'. Первоначальная функция getchar() извлекает U, но оставляет ' \n' для следующего чтения строки. Функция gets(), входящая в getnames(), интерпретировала бы ' \n' как пустую строку, поэтому мы использовали малый цикл while, чтобы избавиться от символа «новая строка». Действительно, простая getchar(), сделала бы это, если бы пользователь непосредственно за U нажимал бы [ввод]. Но наша версия, кроме того, предусматривает возможность нажать на клавишу пробела несколько раз перед [ввод].

В функции getnames() для вас не должно быть сюрпризов. Учтите, что мы запрещаем пользователю применять одинаковые имена для выходного и входного файлов. Стандартная версия функции fopen() не позволяет вам и читать и записывать один и тот же файл, если вы открыли его один раз.

Функция conv() является функцией копирования с выполнением преобразования. Значение crit используется для определения требуемого преобразования. Работа выполняется простым условным оператором, таким как

 

ch = islower(ch)? toupper(ch): ch;

 

Он проверяет, является ли ch строчной буквой. Если да, то символ преобразуется в прописную букву. Если нет, остается как есть.

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

 

7.29. Преобразования символьных строк: atoi(), atof().

Использование scanf() для считывания цифровых значений не является самым надежным способом, поскольку scanf () легко ввести в заблуждение ошибками пользователей при вводе чисел с клавиатуры. Некоторые программисты предпочитают считывать даже числовые данные как символьные строки и преобразовывать строку в соответствующее числовое значение. Для этого используются функции atoi() и atof(). Первая преобразует строку в целое, вторая — в число с плавающей точкой. Вот образец их использования:

 

/* включение atoi() */

#include <stdio.h>

#include <windows.h>

#include<ctype.h>

#define issign(c) (((c) =='-' || (c) =='+')? (1): (0))

#define SIZE 10

#define YES 1

#define NO 0

void main()

{

char ch;

static char number [SIZE];

int value;

int digit = YES;

int count = 0;

puts(" Enter integer number.");

gets(number);

if (number[SIZE - 1]!= '\0')

{

puts(" Too many numbers; You killed me.");

exit(1);

}

while ((ch = number [count])!= '0' && digit == YES)

if(!issign(ch) &&!isdigit(ch) &&!isspace(ch))

digit = NO;

if (digit == YES)

{

value = atoi(number);

printf("The number was %d.\n", value);

}

else

printf(" It doesn't look like integer.");

}

 

Мы предусмотрели проверку некоторых ошибок.

Во-первых, следует посмотреть, умещается ли входная строка в предназначенном для нее массиве. Поскольку number является статическим символьным массивом, он инициализируется нулями. Если последний элемент массива не является нулем, значит что-то неверно, и программа прекращает работу. Здесь мы использовали библиотечную функцию exit(), которая выводит нас из программы. Немного позже мы расскажем кратко об этой функции.

Затем посмотрим, не содержит ли строка что-нибудь кроме пробелов, цифр и алгебраических знаков. Функция отвергает такие строки, как «дерево» или «1.2Е2». Ее устраивает смесь, подобная «3 - 4 + 2», но atoi() будет выполнять дальнейший отбор. Вспомним, что! является операцией отрицания, поэтому!isdigit(c) означает: «с не является цифрой».

Строка

 

value = atoi(number);

 

показывает, как используется функция atoi(). Ее аргумент является указателем символьной строки; в этом случае мы применили имя массива number. Функция возвращает целое значение для такой строки. Таким образом, «1234» является строкой из четырех символов и переводится в 1234 — единое число типа int.

Функция atoi() игнорирует ведущие пробелы, обрабатывает ведущий алгебраический знак, если он есть, и обрабатывает цифры вплоть до первого символа, не являющегося цифрой. Поэтому наш пример «3 - 4 + 2» был бы превращен в значение 3. Посмотрите «Вопросы» в конце главы для возможного применения этой функции.

Функция atof() выполняет подобные действия для чисел с плавающей точкой. Она возвращает тип double, поэтому должна быть описана как double в использующей ее программе.

Простые версии atof() будут обрабатывать числа вида 10.2, 46 и —124.26. Более мощные версии преобразуют также экспоненциальную запись, т. е. числа, подобные 1.25Е — 13.

Ваша система может также иметь обратные функции, работающие в противоположном направлении. Функция itоа() будет преобразовывать целое в символьную строку, а функция ftoa() преобразовывать число с плавающей точкой в символьную строку.

 

7.30. Ввод и вывод целых чисел.

В некоторых программах возникает необходимость ввода и вывода в поток (или в буфер) целочисленной информации. Для этого в С имеется две функции: getw() и putw().

 

7.30.1. Использование функций getw() и putw().

Дополняющие друг друга функции getw() и putw() весьма похожи на функции getc() и putc(); отличие в том, что они работают с целыми числами, а не с символами. Функции getw() и putw() можно использовать только с файлами, открытыми в двоичном режиме. Следующая программа открывает файл в двоичном режиме, записывает в него десять целых чисел, закрывает файл, а затем заново открывает файл на считывание и распечатывает числа:

 

/*

Программа на С, использующая функции getw и putw с файлом,

открытом в двоичном режиме

*/

#include "stdafx.h"

#include "E:\LECTURE\AlgorithmProgramming\Universal_HederFile.h"

void StopWait(void);

 

#define ISIZE 10

 

int main()

{

FILE *pfi;

int ivalue,ivalues[ISIZE],i;

pfi = fopen("E:\\LECTURE\\AlgorithmProgramming\\integer.dat", "wb");

if (pfi = NULL)

{

printf("File could not be opened"); /* Файл невозможно открыть */

exit(1);

for(i = 0; i < ISIZE; i++)

{

ivalues [i]=i- NULL;

putw (ivalues [i],pfi);

}

fclose (pfi);

pfi=fopen("E:\\LECTURE\\AlgorithmProgramming\\integer.dat", "r+b");

if(pfi = NULL)

{

printf("File could not be re-opened"); /* Файл невозможно открыть */

/* заново */

exit(1);

}

while (!feof (pfi))

{

ivalue = getw(pfi);

printf("%3d",ivalue);

}

}

 

StopWait(); /* Wait a little */

return (0);

}

 

Посмотрите на результат работы программы и определите, что неправильно:

 

1 2 3 4 5 6 7 8 9 10 -1

 

Поскольку целое значение, считываемое в последнем цикле, может иметь значение EOF, для проверки признака конца файла в программе используется функция feof(). Однако, эта функция не выполняет опережающего считывания, как делается в подобных функциях в некоторых других языках высокого уровня. В С для определения этого условия необходимо реально выполнить операцию считывания значения "конец файла".

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

 

/*

Программа на С, использующая функции getw и putw с файлом,

открытом в двоичном режиме

*/

#include "stdafx.h"

#include "E:\LECTURE\AlgorithmProgramming\Universal_HederFile.h"

void StopWait(void);

 

#define ISIZE 10

 

main()

{

FILE *pfi;

int ivalue,ivalues[ISIZE],i;

pfi = fopen("E:\\LECTURE\\AlgorithmProgramming\\integer.dat ", "w+");

if (pfi == NULL)

{

printf("File could not be opened"); /* Файл невозможно открыть */

exit(1);

}

for(i = 0; i < ISIZE; i++)

{

ivalues[i]=i+1;

putw(ivalues[i],pfi);

}

fclose (pfi);

 

pfi=fopen("E:\\LECTURE\\AlgorithmProgramming\\integer.dat ", "r+");

if(pfi == NULL)

{

printf("File could not be re-opened"); /* Файл невозможно открыть */

/* заново */

exit(1);

}

while(!feof(pfi))

{

ivalue=getw(pfi);

printf("%3d",ivalue);

}

 

StopWait(); /* Wait a little */

return (0);

}

 

Перед тем как в программе начинается последний цикл while, выполняется предварительное считывание для того, чтобы определить, не пустой ли файл, и, если это так, то действующее целое значение запоминается в переменной ivalue. Однако, если файл пустой, то функция feof() распознает это, и цикл while не выполняется.

Обратите также внимание на то, что предварительное считывание вызывает перестановку операторов внутри цикла while. При входе в цикл переменная ivalue содержит действующее целое значение. Если бы операторы в цикле оставались теми же, что и в предыдущей программе, то сразу же выполнился бы второй вызов функции getw() и при этом было бы потеряно первое целое значение. Из-за наличия предварительного считывания первым оператором в цикле while должен быть оператор вывода, за которым следует вызов функции getw() для считывания следующего значения.

Предположим, что цикл while выполнился девять раз. К концу девятого прохода выполнилась эхо-печать целых чисел от 1 до 8 и переменной ivalue присвоено значение 9. При следующем проходе цикла печатается 9 и вводится значение 10. Поскольку значения 10 и EOF не совпадают, цикл повторяется снова, в результате чего печатается значение 10 и считывается EOF. В этот момент цикл прекращается, поскольку функция feof() распознает условие конца файла.

Два приведенных примера иллюстрируют необходимость в соблюдении осторожности при написании программ с функцией feof(). Это — специфическая программистская проблема, так как каждый язык высокого уровня может трактовать условие конца файла по-своему. В некоторых языках при считывании данных выполняется предварительный анализ возможного на следующем этапе условия конца файла; в других языках, таких как С, этого не происходит.

 

7.31. Форматированный вывод.

Богатый ассортимент средств управления форматом вывода в С позволяет легко создавать печатные графики, отчеты или таблицы. Двумя основными функциями, выполняющими этот форматированный вывод, являются printf() и эквивалентная функция для файлов — fprintf(). Эти функции могут использовать любые символы преобразования, показанные в табл. 11.2. Спецификация формата имеет следующий вид:

 

%[флаги] [ширина] [.точность] [{h | 1 | L}]тип

 

Таблица 11.2. Символы преобразования для функций printf() и fprintf()

 

ПОЛЕ “ТИП”
Символ Тип Формат вывода
c int или wint_t printf—означает однобайтный символ wprintf—означает широкий символ
C int или wint_t printf—означает широкий символ wprintf—означает однобайтный символ
d int Десятичное целое зо знаком
e double Число со знаком в виде [-]d.ddd e [знак]ddd,где d-отдельная десятичная цифра, ddd-одна или несколько десятичных цифр, ddd-ровно четыре десятичные цифры и знак “+” или ”-”
E double То же что и “е”, за исключением того, что перед экспонентой стоит “E”
f double Число со знаком в виде [-]ddd.ddd, где d-одна или несколько десятичных цифр. Число цифр после десятичной точки зависит от точности
g double Число со знаком в формате ”f” или ”e”. Используется наиболее компактная форма. Отсутствуют нули в младших разрядах. Нет десятичной точки, если за ней отсутствуют цифры
G double То же что и “g”, за исключением того, что перед экспонентой стоит “G”
i int Десятичное целое со знаком
n Указатель на целое Количество символов, записанных в поток или буфер. Адрес буфера, определяемого целочисленным аргументом
o Int Восьмеричное число без знака
p Указатель на void Печатается адрес(определяемый аргументом)
s строка printf – определяет строку однобайтных символов wprintf - определяет строку широких символов(печать в NULL или с максимальной точностью)
S строка printf – определяет строку широких символов wprintf - определяет строку однобайтных символов (печать в NULL или с максимальной точностью)
u строка Десятичное целое без знака
x int Шестнадцатеричное целое без знака (используются символы нижнего регистра)
X int Шестнадцатеричное целое без знака (используются символы верхнего регистра)

 

Таблица 11.2 Символы преобразования для функций printf() и fprintf() (продолжение)

 

Флаг Значение
# Перед ненулевыми значениями ставиться 0, 0x, или 0X (по умолчанию пробелы отсутствуют)
. Для форматов “e”, “E”, или “f” символ “#” указывает на наличие в выходном значении десятичной точки во всех случаях (по умолчанию точка появляется тогда, когда за ним следуют цифры)
- Если число введенных символов оказывается меньше указанного, результаты выравниваются по левому краю поля вывода(по умолчанию принято правостороннее выравнивание
+ При вводе знаковых чисел знак отображается всегда(по умолчанию знак устанавливается только перед отрицательными числами)
  Если значению поля ширина предшествует символ ‘0’, выводимое число дополняется ведущими нулями до минимальной ширины поля вывода(по умолчанию в качестве заполнителей применяются пробелы); при левостороннем выравнивании игнорируется
пробел Если выводится положительное знаковое число, перед ним ставится пробел(по умолчанию пробел в таких случаях не ставится); игнорируется при наличии флага +

 

Поле спецификации является символом или числом, которое задает опцию форматирования. Простейший случай — знак процента и тип: например, %f. Поле "тип" используется для того, чтобы определить, что аргумент должен интерпретироваться как символ, строка или число. Поле "флаги" используется для управления печатью знаков, пробелов, десятичных точек, основания системы счисления выходных значений и так далее. Поле "ширина" указывает минимальное число печатаемых символов. Поле "точность" указывает максимальное число символов, печатаемых при выводе. Символы h | l | L являются необязательными префиксами, определяющими размер аргумента.

 

7.31.1. Использование функций printf() и fprintf().

Мы уже обсуждали функцию printf () довольно основательно. Подобно puts (), она использует указатель строки в качестве аргумента. Функция printf() менее удобна, чем puts (), но более гибка. Разница заключается в том, что printf () не выводит автоматически каждую строку текста с новой строки. Вы должны указать, что хотите выводить с новых строк. Так,

 

printf(" %s\n", string);

 

дает то же самое, что и

 

puts(string);

 

Вы можете видеть, что первый оператор требует ввода большего числа символов и большего времени при выполнении на компьютере. С другой стороны, printf () позволяет легко объединять строки для печати их в одной строке. Например:

 

printf(" Хорошо, %s, %s\n", name, MSG);

 

объединяет " Хорошо" с именем пользователя и с символьной строкой MSG в одну строку.

 

Функции ввода-вывода fprintf() и fscanf() работают почти как printf() и scanf(), но им нужен дополнительный аргумент для ссылки на сам файл. Он является первым в списке аргументов. Вот пример, иллюстрирующий обращение к этим функциям:

 

/* образец использования fprintf() и fscanf() */

#include <stdio.h>

void main()

{

FILE *fi;

int age;

fi = fopen("sam.txt", "r"); /* считывание */

fscanf(fi, " %d", &age); /* fi указывает на sam */

fclose(fi);

fi = fopen("data.txt", "a"); /* дополнение */

fprintf(fi, "sam is %d.\n", age); /* fi указывает на data */

fclose(fi);

}

 

Заметим, что можно было использовать fi для двух различных файлов, потому что мы закрыли первый файл, прежде чем открыть второй.

В отличие от getc() и putc() эти две функции получают указатель типа FILE в качестве первого аргумента. Две другие, описанные ниже, получают его в качестве последнего аргумента.

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

 

/*

Программа на С, демонстрирующая развитые средства преобразования

и форматирования

*/

#include "stdafx.h"

#include "E:\LECTURE\AlgorithmProgramming\Universal_HederFile.h"

void StopWait(void);

 

main()

{

char c = 'A',

psz1[] = "In making a living today many no ",

/* Для того, чтобы жить, сегдня многие */

psz2[] = "longer leave any room for life.";

/* не ыыходят из комнат в течение всей жизни. */

int iln = 0,

ivalue = 1234;

double dPi = 3.14159265;

 

/* преобразования */

printf("\n[%2d] %c",++iln,c); /*01*//* печать символа с */

printf("\n[%2d] %d",++iln,c); /*02*//* печать ASCII-кода символа с */

printf("\n[%2d] %c",++iln,90); /*03*//* печать символа с ASCII-кодом 90 */

printf("\n[%2d] %o",++iln,ivalue); /*04*//* печать ivalue в восьмеричном виде */

printf("\n[%2d] %x",++iln,ivalue); /*05*//* печать шестнадцатеричного числа буквами нижнего регистра */

printf("\n[%2d] %X",++iln,ivalue); /*06*//* печать шестнадцатеричного числа буквами верхнего регистра */

 

/* опции преобразования и форматирования */

printf("\n[%2d] %c",++iln,c); /*07*//* минимальная ширина 1*/

printf("\n[%2d] %5c",++iln,c); /*08*//* минимальная ширина 5, выравнивание вправо */

printf("\n[%2d] %-5c",++iln,c); /*09*//* минимальная ширина 5, выравнивание влево */

printf("\n[%2d] %s",++iln,psz1); /*10*//* 33 не-null символа с автоматическим определением ширины */

printf("\n[%d] %s",++iln,psz2); /*11*//* 31 не-null символ с автоматическим определением ширины */

printf("\n[%d] %5s",++iln,psz1); /*12*//* минимальная ширина 5 переопределена, автоматическая — 33 */

printf("\n[%d] %38s",++iln,psz1);/*13*//* минимальная ширина 38, выравнивание вправо */

printf("\n[%d] %-38s",++iln,psz2);/*14*//* минимальная ширина 38, выравнивание влево */

printf("\n[%d] %d",++iln,ivalue);/*15*//* ширина ivalue по умолчанию 4 */

printf("\n[%d] %+d",++iln,ivalue);/*16*//* печать ivalue со знаком "+" */

printf("\n[%d] %3d",++iln,ivalue);/*17*//* минимальная ширина 3 переопределена, автоматическая — 4 */

printf("\n[%d] %10d",++iln,ivalue);/*18*//* минимальная ширина 10, выравнивание вправо */

printf ("\n[%d] %-10d",++iln,ivalue); /*19*//* минимальная ширина 10, выравнивание влево */

printf ("\n[%d] %010d", ++iln, ivalue); /*20*//* выравнивание влево с дополнением пробелов */

printf("\n[%d] %f",++iln,dPi); /*21*//* использование количества цифр по умолчанию */

printf("\n[%d] %20f",++iln,dPi); /*22*//* минимальная ширина 20, выравнивание вправо */

printf("\n[%d] %020f",++iln,dPi); /*23*//* выравнивание вправо с ведущими нулями */

printf("\n[%d] %-20f",++iln,dPi); /*24*//* минимальная ширина 20, выравнивание влево */

 

/* дополнительная точность при форматировании */

printf("\n[%d] %19.19s",++iln,psz1); /*25*//* минимальная ширина 19, печать всех 19 */

printf("\n[%d] %.2s",++iln,psz1); /*26*//* печать первых 2-х символов */

printf("\n[%d] %19.2s",++iln,psz1); /*27*//* печать 2-х символов, выравнивание вправо */

printf("\n[%d] %-19.2s",++iln,psz1); /*28*//* печать 2-х символов, выравнивание влево */

printf("\n[%d] %*.*s",++iln,19,6,psz1); /*29*//* использование аргументов printf */

printf("\n[%d] %10.8f",++iln,dPi); /*30*//* ширина 10; 8 справа от '.' */

printf("\n[%d] %20.2f",++iln,dPi); /*31*//* ширина 20; 2 до правой границы выравнивания */

printf("\n[%d] %-20.4f",++iln,dPi); /*32*//* 4 десятичных позиций, выравнивание влево */

printf("\n[%d] %20.4f",++iln,dPi); /*33*//* 4 десятичных позиций, выравнивание вправо */

printf("\n[%d] %20.2e",++iln,dPi); /*34*//* ширина 20, экспоненциальное представление */

 

StopWait(); /* Wait a little */

return (0);

}

 

 

Результат работы программы выглядит следующим образом:

 

[ 1] А

[ 2] 65

[ 3] Z

[ 4] 2322

[ 5] 4d2

[ 6] 4D2

[ 7] А

[ 8] А

[ 9] A

[10] In making a living today many no

[11] longer leave any room for life.

[12] In making a living today many no

[13] In making a living today many no

[14] longer leave any room for life.

[15] 1234

[16] +1234

[17] 1234

[18] 1234

[19] 1234

[20] 0000001234

[21] 3.141593

[22] 3.141593

[23] 0000000000003.141593

[24] 3.141593

[25] In making a living

[26] In

[27] In

[28] Ini

[29] In mak

[30] 3.14159265

[31] 3.14

[32] 3.1416

[33] 3.1416

[34] 3.14e+000

 

 

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

 

7.32. Использование функций fseek(), ftell() и rewind().

Функция fseek() позволяет нам обрабатывать файл подобно массиву и непосредственно достигать любого определенного байта в файле, открытом функцией fорen(). Вот простой пример, показывающий, как она работает. Как и в наших предыдущих примеpax, функция использует аргумент командной строки для получения имени файла, с которым она работает. Заметим, что fseek() имеет три аргумента и возвращает значение типа int.

 

/* использование fseek() для печати содержимого файла */

#include <stdio.h>

void main(int number,char *names []) /* не следует использовать argc и argv */

{

FILE *fp;

long offset = 0L; /* обратите внимание, что это тип long */

if (number < 2)

puts ("I need a name of file as an argument");

else

{

if ((fp = fopen(names[1], "r")) == 0)

printf(" I can't open file %s.\n", names[1]);

else

{

while(fseek(fp, offset++, 0) == 0)

putchar(getc(fp));

fclose(fp);

}

}

}

Первый из трех аргументов функции fseek() является указателем типа FILE на файл, в котором ведется поиск. Файл следует открыть, используя функцию fopen().

Второй аргумент назван "offset" (вот почему мы выбрали данное имя для переменной). Этот аргумент сообщает, как далеко следует передвинуться от начальной точки (см. ниже); он должен иметь* значение типа long, которое может быть положительным (движение вперед) или отрицательным (движение назад).

Третий аргумент является кодом, определяющим начальную точку:




Поделиться с друзьями:


Дата добавления: 2015-01-03; Просмотров: 656; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.227 сек.