Консультация № 174336
18.11.2009, 06:01
0.00 руб.
0 3 2
Уважаемые эксперты помогите написать программу на C под Linux:
Используя средства динамического распределения памяти:считать в буфер заданный текстовый файл, преобразовать символы в верхний
регистр и вывести на экран;

Обсуждение

Неизвестный
18.11.2009, 07:53
общий
это ответ
Здравствуйте, fernando.
Программа. C99. Компилировал gcc.
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
char fname[80];
FILE* file;
// Вводим имя файла
printf("Путь к файлу:");
fgets(fname,sizeof(fname),stdin);
fname[strlen(fname)-1]=0;

// Открываем
if((file=fopen(fname,"r"))!=0)
{
// Определим размер буфера
if(fseek(file,0,SEEK_END))
{
printf("Ошибка\n");
return -1;
}
size_t length=ftell(file);
rewind(file);

char* buffer;
// Выделим память
if((buffer=malloc(length))!=0)
{
// Читаем
if(fread(buffer,length,1,file)==1)
{
// В верхний регистр
char *ch=buffer,*end=buffer+length;
while(ch!=end)
{
*ch=toupper(*ch);
++ch;
}
printf("%s",buffer);
}
else
{
printf("Ошибка чтения\n");
fclose(file);
return -1;
}
}
else
{
printf("Невозможно выделить память для буфера\n");
fclose(file);
return -1;
};
fclose(file);
}
else
{
printf("Не удалось открыть файл:%s\n",fname);
}
return (0);
}

давно
Старший Модератор
17042
808
18.11.2009, 15:17
общий
это ответ
Здравствуйте, fernando!
Ещё один вариант решения. Комментарии в коде.


Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
//---------------------------------------------------------------------------------------------------
int main()
{
char* psFileName = (char*)calloc(sizeof(char), 256); // Имя файла - 256 символов
char* psText;
printf("Введите имя файла: ");
scanf("%s", psFileName);
FILE* pTextFile = fopen(psFileName, "r");
if(pTextFile == NULL)
{
printf("Невозможно открыть файл для чтения.\n");
exit(1);
}
else
{
long int liFileSize;
fseek(pTextFile, 0, SEEK_END);
liFileSize = ftell(pTextFile); // Узнаём размер файла
psText = (char*)malloc(liFileSize); // Выделяем память под текст из файла
int i = 0;
rewind(pTextFile); // Позиционируем на начало файла
while(!feof(pTextFile)) // Пока не достигнут конец файла...
{
psText[i] = fgetc(pTextFile); // ...считываем символы
i++;
}
psText[i - 1] = '\0'; // В конец считанной строки - нулевой символ
fclose(pTextFile);
printf("Загруженный текст: \n"%s"\n", psText);

for(i = 0; psText[i] != '\0'; i++)
{
psText[i] = toupper(psText[i]); // Каждый символ строки - в верхний регистр
}

printf("Преобразованный текст: \n"%s"\n", psText);
}

return 0;
}
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
18.11.2009, 15:28
общий
fernando:
Обратите внимание, что как моя программа, так и программа предыдущего эксперта в дистрибутивах Linux с локалью UTF8 (т.е. в большинстве современных) не будет работать корректно с русским текстом: в отличие от текста, набранного латиницей, кириллические символы к верхнему регистру приводиться не будут.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа