- Помогите новичку, 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); } я сделал бы вот как-то так :)
|