Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Зеркальное отображение.


Автор: Sandr12 23.3.2010, 22:55
Задача:
Создать файл и внести в него последовательность символов.Вывести из этого файла в результирующий файл символы в обратной последовательности(зеркольное отображение).

 smile
желательно с комментариями,чтоб хоть немного разобраться... smile 

MVC++
 

Автор: ИванМ 23.3.2010, 23:22
Код

#include <fstream>
#include <string>
#include <algorithm>

int main()
{
    using namespace std;

    //строка символов
    string outs="123456789";

    //открываем первый файл для записи
    ofstream f1out("c:\\1.txt");    
    //записываем символы
    f1out<<outs;
    //закрываем файл
    f1out.close();
    
    //открываем первый файл для чтения
    ifstream f1in("c:\\1.txt");
    string ins;
    //читаем символы
    f1in>>ins;
    //закрываем файл
    f1in.close();

    //обращаем строку символов
    reverse(ins.begin(), ins.end());

    //открываем второй файл для записи
    ofstream f2out("c:\\2.txt");    
    //записываем обращенную строку
    f2out<<ins;
    //закрываем файл
    f2out.close();
}

Автор: Sandr12 24.3.2010, 00:50
ошибка:
c:\microsoft visual studio\myprojects\lb\lb.cpp(35) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.
 smile 

Автор: Sandr12 24.3.2010, 01:06
ИванМ, а можно без STL?

желательно с fprintf, fscanf...

Автор: ИванМ 24.3.2010, 21:01
Цитата(Sandr12 @  24.3.2010,  00:50 Найти цитируемый пост)
ошибка:
c:\microsoft visual studio\myprojects\lb\lb.cpp(35) : fatal error C1010: unexpected end of file while looking for precompiled header directive

если используешь прекомпиленные хэдеры, надо все инклуды поместить в stdafx.h

Цитата(Sandr12 @  24.3.2010,  01:06 Найти цитируемый пост)
ИванМ, а можно без STL?
желательно с fprintf, fscanf... 

тогда не ко мне

Автор: Sandr12 24.3.2010, 23:15
а к кому?))
аууу!!!
кто подскажет?)

Автор: t_gran 25.3.2010, 04:52
Sandr12, вот уже несколько лет вожусь со студентами и никак не могу понять, неужели вам самим не интересно? А если не интересно, то зачем выбирать специальности связанные с этим? http://habrahabr.ru/blogs/arbeit/88787/ - прочтите первые два пункта. А сама программа, вот, пожалуйста на C:
Код

#include <stdio.h>

#define FILE_INPUT   "file.txt"
#define FILE_OUTPUT  "file_out.txt"

//----------------------------------------------//
// Функция определяет длину файла
long FileLength (FILE *theFile)
{
   fseek(theFile, 0, SEEK_END);  // Устанавливаем курсор в конец файла
   long len= ftell(theFile);     // Возвращаем позицию, она и является размерностью в байтах
   fseek(theFile, 0, SEEK_SET);  // Возвращаем курсор в начало файла
   return len;
}
//----------------------------------------------//
// Функция делает реверс строки: Вася -> ясаВ
int TextReverse (char *theText, int len)
{
   int i;
   for (i= 0; i < len/2; ++i)
   {
      char buff= theText[i];
      theText[i]= theText[len-i-1];
      theText[len-i-1]= buff;
   }
   return 0;
}
//----------------------------------------------//
int main (int argc, char **argv)
{
   FILE *f= fopen(FILE_INPUT, "r");
   if (!f)  // Убеждаемся в наличие файла
   {
      printf("Error: file '%s' not found ...", FILE_INPUT);
      return 1;
   }
   long len= FileLength(f);
   if (!len)   // Проверяем на наличие данных в файле
   {
      printf("Error: file is empty ...");
      return 2;
   }
   // Выделяем память под строку (+1 для завершающего символа '\0')
   char *text= (char *) malloc(sizeof(char) * len + 1);

   // Считываем строку из файла
   fgets(text, len+1, f);

   fclose(f);

   TextReverse(text, len);

   f= fopen(FILE_OUTPUT, "w");
   fputs(text, f);
   fclose(f);

   free(text);

   return 0;
}


Автор: Dov 26.3.2010, 03:33
Я не знаю, что здесь комментировать... сам разбирайся   smile 
Код
void printBack(FILE * in, FILE * out, char ch)
{    
    if(ch != '\n')
    {
        fputc(ch, in);
        printBack(in, out, getchar());
        fputc(ch, out);
    }
}

int main()
{
    FILE * infile  = fopen("input.txt" , "w");
    FILE * outfile = fopen("output.txt", "w");

    puts("Enter a string: ");
    printBack(infile, outfile, getchar());

    fclose(infile);
    fclose(outfile);
    return 0;
}

Автор: Sandr12 30.3.2010, 01:33
t_gran,

Добавлено через 3 минуты и 39 секунд
t_gran, спасибо,прочитал все пункты.
времени мало на программирование остаётся =(
8 предметов в университете...

Добавлено через 3 минуты и 56 секунд
ребят,не пойму какие библиотеки подключать...

Автор: likehood 30.3.2010, 10:42
Цитата(Sandr12 @  30.3.2010,  01:33 Найти цитируемый пост)
ребят,не пойму какие библиотеки подключать... 

Если речь идет о программе t_gran'а, то в ней есть все что нужно.
Если у тебя проблемы с precompiled headers, можешь их просто отключить (проект -> свойства -> С/С++ -> precompiled headers -> первая строчка - ставишь "не использовать")

P.S.
Dov, в твоей программе есть небольшое несоответствие заданию. Ты сразу создаешь оба файла, а нужно создать первый файл и на основе него создать перевернутый файл. Программа не сильно изменится, но все же. Кстати, за рекурсию - респект!  smile 

Автор: Dov 30.3.2010, 12:20
Цитата(likehood @  30.3.2010,  10:42 Найти цитируемый пост)
Dov, в твоей программе есть небольшое несоответствие заданию. Ты сразу создаешь оба файла, а нужно создать первый файл и на основе него создать перевернутый файл.

Ну, если только проблемма в этом, то можно внести небольшие изменения...
Код
void printBack(FILE * in, FILE * out)
{
    char ch;

    if((ch = fgetc(in)) != EOF)
    {        
        printBack(in, out);
        fputc(ch, out);    
    }
}

int main()
{
    FILE * infile  = fopen("input.txt" , "w");
    FILE * outfile = fopen("output.txt", "w");
    char   ch;
    
    puts("Enter a string: ");    
    while((ch = getchar()) != '\n')
        fputc(ch, infile);
    fclose(infile);

    infile  = fopen("input.txt", "r");
    printBack(infile, outfile);
    
    fclose(infile);
    fclose(outfile);
    return 0;
}
 

Так лучше?  smile 

Автор: likehood 30.3.2010, 13:38
Цитата(Dov @  30.3.2010,  12:20 Найти цитируемый пост)
Так лучше?  smile  

Во, другое дело!
Главное теперь, чтобы Сандр12 разобрался.

Автор: Sandr12 31.3.2010, 01:55
угу...поймёт... smile

вот две ошибки:
c:\microsoft visual studio\myprojects\new2\new2.cpp(44) : error C2065: 'malloc' : undeclared identifier
c:\microsoft visual studio\myprojects\new2\new2.cpp(52) : error C2065: 'free' : undeclared identifier

Автор: t_gran 31.3.2010, 04:02
Sandr12, заголовочник malloc.h не пробовали подключать?

Блин, нашёл в своём примере два бага:
1. fgets - считывает до конца строки (неприятно, если нужно работать с множеством строк).
2. Писал без учёта различных методов разрыва строки (Windows, Linux).

В общем fgets заменена на fread, а поиск конца документа описан в строке 20.

Код

#include <stdio.h>

#define FILE_INPUT  "file.txt"
#define FILE_OUTPUT "file_out.txt"

//----------------------------------------------//
// Функция определяет длину файла
long FileLength (FILE *theFile)
{
   fseek(theFile, 0, SEEK_END);  // Устанавливаем курсор в конец файла
   long len= ftell(theFile);     // Возвращаем позицию, она и является размерностью в байтах
   fseek(theFile, 0, SEEK_SET);  // Возвращаем курсор в начало файла
   return len;
}
//----------------------------------------------//
// Функция делает реверс строки: Вася -> ясаВ
int TextReverse (char *theText, int len)
{
   int i;
   while (!theText[--len]);
   for (i= 0; i < len/2; ++i)
   {
      char buff= theText[i];
      theText[i]= theText[len-i];
      theText[len-i]= buff;
   }
   return 0;
}
//----------------------------------------------//
int main (int argc, char **argv)
{
   FILE *f= fopen(FILE_INPUT, "r");
   if (!f)  // Убеждаемся в наличие файла
   {
      printf("Error: file '%s' not found ...", FILE_INPUT);
      return 1;
   }
   long len= FileLength(f);
   if (!len)   // Проверяем на наличие данных в файле
   {
      printf("Error: file is empty ...");
      return 2;
   }

   // Выделяем память под строку (+1 для завершающего символа '\0')
   char *text= (char *) malloc(sizeof(char) * len + 1);

   // Считываем строку из файла
   fread(text, len, 1, f);

   fclose(f);

   TextReverse(text, len);

   f= fopen(FILE_OUTPUT, "w");
   fputs(text, f);
   fclose(f);

   free(text);

   return 0;
}

Бинарник с исходником ниже.

Автор: Sandr12 31.3.2010, 21:08
ррррррррр  smile 
Н Е  П О Л У Ч А Е Т С Я !!!!!!!!!

это ещё что???:
Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
The thread 0x2850 has exited with code 1 (0x1).
The program 'C:\Microsoft Visual Studio\MyProjects\new2\Debug\new2.exe' has exited with code 1 (0x1).

Автор: Luyan 31.3.2010, 22:26
Цитата(Sandr12 @  31.3.2010,  21:08 Найти цитируемый пост)
это ещё что???:
Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
The thread 0x2850 has exited with code 1 (0x1).
The program 'C:\Microsoft Visual Studio\MyProjects\new2\Debug\new2.exe' has exited with code 1 (0x1).

Это не ошибки, не вали всё в кучу.
Что ты хочешь получить в результате? Ты положил в папку со своим проектом file.txt ? Думаю ты этого не сделал, поэтому программа не находит файл и выводит Error: file 'file.txt' not found ...  и закрывается.

ТС ССЗБ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)