The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Помогите новичку"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Помогите новичку"  
Сообщение от dimau (ok) on 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;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Помогите новичку"  
Сообщение от Slimm (??) on 07-Июн-07, 13:57 
malloc(); и подобные ...

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

сделай так:

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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


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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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


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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Помогите новичку"  
Сообщение от dimau (ok) on 07-Июн-07, 15:14 
Проблему решил так:
#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 использовать

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Помогите новичку"  
Сообщение от Николай (??) on 08-Июн-07, 20: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;
>}

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Помогите новичку"  
Сообщение от Николай (??) on 08-Июн-07, 21:11 
#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);
}
я сделал бы вот как-то так :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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