The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Помогите новичку, !*! dimau, 07-Июн-07, 12:49  [смотреть все]
Задача, прочитать текстовые данные из файла и записать их в другой, вроди все ок, но в конце дописывает какие-то крякозябли. ( подозреваю что это из-за размера буфера buf ), следовательно вопрос - как изменять размер буфера в соответствии с кол-вом инф-ии во входном файле?

#include <stdio.h>

int main(void)
{
   FILE *stream;
   FILE *stream2;
   char buf[200]; // тут размер буфера указывается

   //read data from file

   if ((stream = fopen("data.in", "r")) //читаю файл
     == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n");
      return 1;
   }
   fread(buf, 200, 1, stream);
   printf( "%s", buf ); //все ок, распечатывает то что надо

   //write data to another file

   if ((stream2 = fopen("data.out", "wb")) == NULL)

   {
      fprintf(stderr, "Cannot open output file.\n");
      return 1;
   }

   fwrite(buf, sizeof(buf)+1, 1, stream2); //пишет нормально, но в конце много мусора добавляет
   fclose(stream2);
   return 0;
}

  • Помогите новичку, !*! Slimm, 13:57 , 07-Июн-07 (1)
    malloc(); и подобные ...

    такой вопрос может надо на программистких форумах писать?

  • Помогите новичку, !*! NuINu, 13:57 , 07-Июн-07 (2)
    >Задача, прочитать текстовые данные из файла и записать их в другой, вроди
    >все ок, но в конце дописывает какие-то крякозябли. ( подозреваю что
    >это из-за размера буфера buf ), следовательно вопрос - как изменять
    >размер буфера в соответствии с кол-вом инф-ии во входном файле?

    сделай так:

    int cnt = fread(buf, 200, 1, stream);
    fwrite(buf, cnt, 1, stream2);

    • Помогите новичку, !*! dimau, 14:01 , 07-Июн-07 (3)
      >>Задача, прочитать текстовые данные из файла и записать их в другой, вроди
      >>все ок, но в конце дописывает какие-то крякозябли. ( подозреваю что
      >>это из-за размера буфера buf ), следовательно вопрос - как изменять
      >>размер буфера в соответствии с кол-вом инф-ии во входном файле?
      >
      >сделай так:
      >
      >int cnt = fread(buf, 200, 1, stream);
      >fwrite(buf, cnt, 1, stream2);


      К сожалению надо сначала обработать все данные целиком, а только потом писать все в файл, т.к. копирование напрямую тут неподойдет :(

      • Помогите новичку, !*! NuINu, 14:06 , 07-Июн-07 (4)
        >>>Задача, прочитать текстовые данные из файла и записать их в другой, вроди
        >>>все ок, но в конце дописывает какие-то крякозябли. ( подозреваю что
        >>>это из-за размера буфера buf ), следовательно вопрос - как изменять
        >>>размер буфера в соответствии с кол-вом инф-ии во входном файле?
        >>
        >>сделай так:
        >>
        >>int cnt = fread(buf, 200, 1, stream);
        >>fwrite(buf, cnt, 1, stream2);
        >
        >
        >К сожалению надо сначала обработать все данные целиком, а только потом писать
        >все в файл, т.к. копирование напрямую тут неподойдет :(

        :-))) это ты к чему? я что предложил не все данные обрабатывать?
        ты должне знать сколько ты байт считал! и столько же записывать. а не размер буфера.
        который может быть и 200 и 2000 и 200000 и 10

        • Помогите новичку, !*! dimau, 14:20 , 07-Июн-07 (5)
          Надо вот как ( как я себе представляю ):
          char buf[]; //массив где будут все данные
          FILE *stream;
          stream = fopen("data.in", "r")

          while ((letter = fgetc(stream)) != EOF)
          {
          strncat(buf, letter, 1);
          }

          Т.е. читать файл посимвольно и добавлять к буферу. (В итоге получится что весь файл целиком получится в одной переменной)
          Но проблема: какой размер буфера указать в самом начале?

    • Помогите новичку, !*! dimau, 14:25 , 07-Июн-07 (6)
      >>Задача, прочитать текстовые данные из файла и записать их в другой, вроди
      >>все ок, но в конце дописывает какие-то крякозябли. ( подозреваю что
      >>это из-за размера буфера buf ), следовательно вопрос - как изменять
      >>размер буфера в соответствии с кол-вом инф-ии во входном файле?
      >
      >сделай так:
      >
      >int cnt = fread(buf, 200, 1, stream);
      >fwrite(buf, cnt, 1, stream2);


      Твое решение понял, только cnt почему-то 0 возвращает

      • Помогите новичку, !*! NuINu, 14:30 , 07-Июн-07 (7)
        >>>Задача, прочитать текстовые данные из файла и записать их в другой, вроди
        >>>все ок, но в конце дописывает какие-то крякозябли. ( подозреваю что
        >>>это из-за размера буфера buf ), следовательно вопрос - как изменять
        >>>размер буфера в соответствии с кол-вом инф-ии во входном файле?
        >>
        >>сделай так:
        >>
        >>int cnt = fread(buf, 200, 1, stream);
        >>fwrite(buf, cnt, 1, stream2);
        >
        >
        >Твое решение понял, только cnt почему-то 0 возвращает
        тип наверное другой надо! size_t


        • Помогите новичку, !*! dimau, 15:14 , 07-Июн-07 (8)
          Проблему решил так:
          #include <stdio.h>
          #include <stdlib.h>

          int main () {
            FILE * pFile;
            FILE * stream2;
            long lSize;
            char * buffer;
            size_t result;

            pFile = fopen ( "data.in" , "rb" );
            if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

          // obtain file size:
            fseek (pFile , 0 , SEEK_END);
            lSize = ftell (pFile);
            rewind (pFile);

            // allocate memory to contain the whole file:
            buffer = (char*) malloc (sizeof(char)*lSize);
            if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

            // copy the file into the buffer:

            result = fread (buffer,1,lSize,pFile);
            printf(buffer);


             if ((stream2 = fopen("data.out", "wb")) == NULL)

             {
                fprintf(stderr, "Cannot open output file.\n");
                return 1;
             }

             fwrite(buffer, result, 1, stream2);
             fclose(stream2);


            if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

            /* the whole file is now loaded in the memory buffer. */

            // terminate
            fclose (pFile);
            free (buffer);

            return 0;
          }

          Вопрос снят, действительно, надо malloc использовать

  • Помогите новичку, !*! Николай, 20:49 , 08-Июн-07 (9)
    >Задача, прочитать текстовые данные из файла и записать их в другой, вроди
    >все ок, но в конце дописывает какие-то крякозябли. ( подозреваю что
    >это из-за размера буфера buf ), следовательно вопрос - как изменять
    >размер буфера в соответствии с кол-вом инф-ии во входном файле?
    >
    >#include <stdio.h>
    >
    >int main(void)
    >{
    >   FILE *stream;
    >   FILE *stream2;
    >   char buf[200]; // тут размер буфера указывается
    >
    >   //read data from file
    >
    >   if ((stream = fopen("data.in", "r")) //читаю файл
    >     == NULL)
    >   {
    >      fprintf(stderr, "Cannot open output file.\n");
    >      return 1;
    >   }
    >   fread(buf, 200, 1, stream);
    >   printf( "%s", buf ); //все ок, распечатывает то что
    >надо
    >
    >   //write data to another file
    >
    >   if ((stream2 = fopen("data.out", "wb")) == NULL)
    >
    >   {
    >      fprintf(stderr, "Cannot open output file.\n");
    >      return 1;
    >   }
    >
    >   fwrite(buf, sizeof(buf)+1, 1, stream2); //пишет нормально, но в конце
    >много мусора добавляет
    >   fclose(stream2);
    >   return 0;
    >}

    Сравни размеры файлов stream и stream2, если stream менее 200 байт (напрмер 150 байт), то соответственно в stream2 ты запишешь данные + мусор (150 байт данных и 50 байт мусора)
    1. есть вариант тупо занулить массив перед чтением :) тогда в качестве мусора будут 0
    2. определить размер stream и если он менее 200 байт,тогда писать только столько сколько нужно, а нужно именно размер stream :)

    • Помогите новичку, !*! Николай, 21:11 , 08-Июн-07 (10)
      #include <string.h>
      #include <stdio.h>
      #include <fcntl.h>
      #include <io.h>
      #include <sys/stat.h>


      void main()
      {
      int h1,h2;
      int len;
      char *buf;
      h1=open("data.in",O_READ|O_BINARY,S_IWRITE|S_IREAD);
      if(h<0){return;}//не смогли открыть
      lseek(h1,0,SEEK_ENS);//перейти в конец файла
      len=tell(h1);//получить размер
      lseek(h1,0,SEEK_SET);//вернуться в начало файла
      buf=(char *)malloc(len+1);//выделим буфер
      if(buf==NULL){close(h1);return;}//не смоглы выделить необходимое кол-во памяти
      read(h1,buf,len);//читаем файл
      close(h1);
      //....
      // что-то делаем с данными
      //
      h2=open("data.out",O_CREAT|O_TRUNC|O_WRITE|O_BINARY,S_IWRITE|S_IREAD);
      if(h2<0){free(buf);return;}//не смогли создать файл
      write(h2,buf,len);
      close(h2);
      free(buf);
      }
      я сделал бы вот как-то так :)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру