LINUX.ORG.RU

помогите, плз, не могу открыть файлы на чтение и запись в Си


0

0

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


#include <stdio.h>
#include <ctype.h>
main ()
{
char *POLITIK, *politik;
FILE *po, *fp;
int c;
fp = fopen (POLITIK,"r");
po = fopen (politik,"a");
printf ("1\n");
while ((c = getc(fp)) != EOF)
{
printf ("2\n");
putc(tolower(c), po);
printf ("3\n");
}
}


В файле "POLITIK" содержатся буквы в верхнем регистре, предполагается запись их же в нижнем регистре в файл "politik"
Компилируется нормально, при попытке выполнения выводит цифру 1, и сразу выдаёт Segmentation fault, не выводя ни 2, ни 3.
В чём дело, помогите, пожалуйста??

anonymous

А где имя файла? POLITIK - неинициализированная переменная. Имя файла в неё неплохо было бы прописать... Либо передавать строковую константу в fopen - fopen("POLITIK","a");

Разберись, где у тебя переменные, а где строковые константы.

AngryElf ★★★★★
()
Ответ на: комментарий от AngryElf

Спасибо большое! Переписал, поставив в кавычки. Файл пишет, только почему-то не переводит теперь в нижний регистр. :-/ Опять я чего-то не того наделал?..

anonymous
()
Ответ на: комментарий от anonymous

Поправка: у меня в файле POLITIK русские буквы. При замене на латинские программа заработала, как надо... Обьясните, пожалуйста, как сделать так, чтобы с кириллицей заработало?...

anonymous
()

flame on

А на языке С++ решение твоей задачи могло бы выглядеть так:

#include <iterator>
#include <fstream>

using namespace std;

struct lower : unary_function<char,char>
{
  char operator()(char c) const
  { return tolower(c); }
};

int main(int,char**)
{
  ifstream is("source_file");
  istream_iterator<char> ii(is), eos;
  ofstream os("dest_file");
  ostream_iterator<char> oo(os);
  transform(ii,eos,oo,lower());

  return !is.eof()||!os;
}

компилить g++
по-моему ;-) элегантнее, чем в вашем дурацком си :-)

flame off

eRazor ★★★
()
Ответ на: комментарий от eRazor

Всё честно. Я тоже привел код (шелла). А насчет утилит - чегой-то я в твоём примере не заметил ни кода tolower(). ни кода потоков :)

anonymous
()
Ответ на: комментарий от anonymous

Эх, всю малину испортил. Ну да, ну код шелла. Я когда написал уже, подумал об этом. Я тут С vs C++ провоцировал :-) а ты всё испортил. Всё, пойду застрелюсь.

eRazor ★★★
()
Ответ на: комментарий от anonymous

> Поправка: у меня в файле POLITIK русские буквы. При замене на латинские программа заработала, как надо... Обьясните, пожалуйста, как сделать так, чтобы с кириллицей заработало?...

Читать мануал на функцию, которой ты регистр букв меняешь. Если она умеет работать с неанглийскими буквами, то должна знать про локали. Убедись, что локаль у тебя - русская (man locale).

AngryElf ★★★★★
()
Ответ на: комментарий от AngryElf

Спасибо огромное! Вроде, разобрался...

anonymous
()
Ответ на: комментарий от eRazor

C vs C++. Спорить можно долго. Ты вот попробуй на с++ ядро написать(эт я к примеру). Цели у этих языков разные. спорить глупо

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.