Файлы

Тема в разделе "C/C++/C#", создана пользователем Firiat, 26 мар 2011.

  1. Firiat

    Firiat Well-Known Member

    Регистрация:
    19 окт 2010
    Сообщения:
    48
    Симпатии:
    0
    Привет всем !
    Создал два файла в папке Projects\Rabota c File\Rabota c File , мне нужно скопировать с одного файла в другой информацию до однострочного комментария. Вот что у меня получилось.

    Код (C++):
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iomanip>
    using namespace std;
    void main ()
    {
    char ch;
    FILE *fp=fopen( "test","r" );
    FILE *fp1=fopen( "testa","w" );
    if (fp!=NULL)
    {
    ch=getc(fp);
    while (ch!=EOF)
    {  
    while (ch!='/')
    fputc(ch,fp1);
    ch=getc(fp);
    }
    fclose(fp);
    fclose(fp1);
    }
    }
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    сорри, и в чём проблемы? это и на вопрос как-то не очень похоже, скорее - так, похвастаться =)

    Добавлено: вот тут как-то нехорошо получилось:
     
  3. Firiat

    Firiat Well-Known Member

    Регистрация:
    19 окт 2010
    Сообщения:
    48
    Симпатии:
    0
    она не работает. не копирует из одного файла в другой .
     
  4. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    если надо считать только до символа / , то попробуй переписать цикл while (ch!=EOF) примерно так
    Код (C++):
    while (ch!=EOF) {
    if (ch=='/') break;
    fputc(ch,fp1);
    ch=getc(fp);
    }
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">если считывать надо до //</div></div><div class="sp-body"><div class="sp-content">- вместо break надо считать и проверить следующий символ в файле:
    при EOF - записать / и выйти из while через break,
    при / - выйти из while через break,
    в остальных случаях:
    1) записать /
    2) учесть и записать следующий за / символ, считанный ранее
    3) продолжить дальнейшее считывание файла.
     
  5. Firiat

    Firiat Well-Known Member

    Регистрация:
    19 окт 2010
    Сообщения:
    48
    Симпатии:
    0
    Я хочу считывать построчно . Можно так (только на strcat(fp,"\n")) ругается) ?

    Код (C++):
    while (ch!=EOF)
    {
    if (ch=='/') break;
    fputc(ch,fp1);
    strcat (fp,"\n");
    ch=getc(fp);
     
  6. Firiat

    Firiat Well-Known Member

    Регистрация:
    19 окт 2010
    Сообщения:
    48
    Симпатии:
    0
    если в файле записано так к примеру:

    dfgg//sda
    sads//jhh
    ret//oip

    после записи в другой файл должно быть так :

    dfgg
    sads
    ret
     
  7. ierofant

    ierofant Гость

    Вариант такой есть, но вообще можно подумать ещё попроще. А думать пока не хочется :lovecodeby:
    Код (C++):
    #include <fstream>
    #include <iterator>
    #include <vector>
    #include <algorithm>

    typedef std::vector<char> Vect;
    typedef std::istreambuf_iterator<char> InItr;
    typedef std::ostreambuf_iterator<char> OutItr;

    static bool clear_comments (Vect &_vect);

    int main ()
    {
    Vect vect;
    std::ifstream in ("file1.txt");
    if (in)
    {
    std::copy (InItr (in), InItr (), std::back_inserter (vect));
    in.close ();
    }

    while (clear_comments (vect));

    std::ofstream out ("file2.txt", std::ios::trunc);
    if (out)
    {
    std::copy (vect.begin (), vect.end (), OutItr (out));
    out.close ();
    }

    return 0;
    }

    bool clear_comments (Vect &_vect)
    {
    bool ret = false;
    Vect::iterator beg, end;
    beg = end = std::find (_vect.begin (), _vect.end (), '/');
    if (beg != _vect.end () && *(++end) == '/')
    {
    end = std::find (end, _vect.end (), '\n');
    _vect.erase (beg, end);
    ret = true;
    }
    return ret;
    }
     
  8. ierofant

    ierofant Гость

    Всё таки мысля сама лезет, тоже не идеал, но уже попроще:
    (if/else наверно можно красивее сделать, но я утомился)
    Код (C++):
    #include <fstream>
    #include <iterator>

    typedef std::istreambuf_iterator<char> InItr;

    int main ()
    {
    std::ifstream in ("file1.txt");
    if (in)
    {
    std::ofstream out ("file2.txt", std::ios::trunc);
    if (out)
    {
    bool copy = true;
    for (InItr itr = InItr (in); itr != InItr (); ++itr)
    {
    if (copy)
    {
    if (*itr == '/')
    {
    if (*(++itr) == '/') copy = false;
    else
    {
    out.put ('/');
    if (itr != InItr ())out.put (*itr);
    }
    }
    else out.put (*itr);
    }
    else
    {
    if (*itr == '\n')
    {
    copy = true;
    out.put (*itr);
    }
    }
    }
    out.close ();
    }
    in.close ();
    }

    return 0;
    }
     
  9. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Код (C++):
    #include <stdio.h>

    void main()
    {
    int     ch0, ch1;   // !!! int !!!
    FILE  *fp0, *fp1;

    fp0 = fopen( "text", "rb" );
    if ( fp0 ) {
    fp1 = fopen( "texty", "wb+" );
    while ( (ch0 = fgetc( fp0 )) != EOF ) {
    if ( ch0 == '/' ) {
    if ( (ch1 = fgetc( fp0 )) != EOF ) {
    if ( ch1 == '/' ) {
    while ( ch1 != '\n' && ch1 != EOF ) ch1 = fgetc( fp0 );
    fputc( '\r', fp1 );
    fputc( '\n', fp1 );
    } else {
    fputc( ch0, fp1 );
    fputc( ch1, fp1 );
    }
    }
    } else {
    fputc( ch0, fp1 );
    }
    }
    fclose( fp0 );
    fclose( fp1 );
    }
    }
     
Загрузка...
Похожие Темы - Файлы
  1. lmike
    Ответов:
    27
    Просмотров:
    299
  2. garrick
    Ответов:
    25
    Просмотров:
    665
  3. sgfsdg
    Ответов:
    1
    Просмотров:
    431
  4. vovanabali
    Ответов:
    0
    Просмотров:
    540
  5. anatoliygorbunov
    Ответов:
    1
    Просмотров:
    772

Поделиться этой страницей