数学建模社区-数学中国

标题: 老大,簡單的文件操作程序,不知道錯在那裡!救命阿 [打印本页]

作者: kenneth    时间: 2004-6-9 11:41
标题: 老大,簡單的文件操作程序,不知道錯在那裡!救命阿
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;* Z" R* ~7 q5 H( L8 U8 h
//---------------------------------------------------------------------------% v5 C6 F1 S  V! }; |1 `* Q+ q4 O

. B7 o5 k" {8 W( M# F/ b! {#include <vcl.h>' Y; y9 s6 W7 l+ G7 q
#pragma hdrstop
4 C; i# h* l4 F8 w3 t, e$ F1 G0 g9 C4 a) Q7 f6 U* _, \
#include "Unit1.h"
+ F5 P4 U1 s! y) a# K& K$ I#include <fstream.h>
. Z* R3 K  U9 R9 X( B4 Z; k#include <dir.h>& V8 m4 T. m+ ?
#include <sys\stat.h>
) t1 o/ _/ l) U#include <malloc.h>
( B$ G1 e7 l/ |//---------------------------------------------------------------------------
# x0 [+ I: R2 `3 S# ^; T#pragma package(smart_init)
4 \- ]! L2 O. D  C- B4 Q3 u4 O% D#pragma resource "*.dfm"2 Z: I2 H9 L5 L/ L" y7 F  a% N
TForm1 *Form1;4 y/ s' i, h7 y0 H% O8 Q+ U
        unsigned char *BIN_Byte;6 e! v- _2 i, A2 n% ?' V4 ^
        long BIN_Byte_Len;6 g( Q) |  Y( t* U, v
//---------------------------------------------------------------------------
- |+ ?# L. o( W  v__fastcall TForm1::TForm1(TComponent* Owner)
& a- j; f. m8 W/ y" f  t        : TForm(Owner)0 B: f5 C4 I) S4 p' s, w& ]( a
{
  x) O5 z0 ]9 ]}
" B% O% Z$ V! X: o//---------------------------------------------------------------------------% x  W5 J- s# A' J$ y
void __fastcall TForm1::Button1Click(TObject *Sender)0 q: w/ N5 u5 ^. q  Z
{
! A- j# J, I7 }  c: S4 A9 T2 s; a        char sPath[MAXPATH];
+ I( O4 N' b0 j        struct stat statbuf;
! C" c8 ~& `" C- R$ u: e6 Q, f        FILE *stream;
% _9 p# p4 w8 y$ R( v2 J$ q
9 v$ y; O, `( V! d# {        getcwd(sPath,sizeof(sPath));+ c/ X0 j4 H  ^- @
        OpenDialog1->InitialDir=sPath;
# M" T7 _8 h+ {+ r        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";% v' \5 k0 g- p8 y. T2 k3 V5 g- N
        OpenDialog1->FileName="fileFrom.BIN";' x  y+ R9 Y9 d$ ]. [4 I1 d
        if(OpenDialog1->Execute())
- ]' c0 g. q  w2 m8 A& b        {
+ j  X' J( ]  Z1 X- [1 c. `                strcpy(sPath,OpenDialog1->FileName.c_str());
, H4 T$ k. n' g- i7 X& b- R                stream=fopen(sPath,"rb");
- b. ?+ w9 R: t' L                fstat(fileno(stream),&statbuf);0 Y: P( x6 l- i# {2 O
                BIN_Byte_Len=statbuf.st_size;
2 [3 A. I9 Q: f( h& {& |1 q- Z$ \1 S                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);- S7 |) N" K% E8 E: }& x( ]
                for(int i=0;i<BIN_Byte_Len;i++)) a) `9 ?5 M' _) A
                        fscanf(stream,"%c",&BIN_Byte); //read file
! V& y# F0 t, r4 s0 A! ?6 y                fclose(stream);
: ?8 y2 e7 ~* G8 i3 Q' {        }3 \6 g, }8 ~6 t" ?4 T
        free(sPath);
, T- L. \) Q2 u% H9 D% t        free(stream);
' o& U+ Q8 K1 u$ R}: S% u2 _; N, j
//---------------------------------------------------------------------------
3 @+ X) L9 U" M! ]% ]. ]void __fastcall TForm1::Button2Click(TObject *Sender); g9 N1 _( L5 S3 y9 }% d
{  G3 f) F6 @( \
        char sPath[MAXPATH];
# C4 T1 ?. O$ X3 {6 B9 U7 d0 ?; N; m        FILE *stream;+ u' N- J, f; _- D8 K
        getcwd(sPath,sizeof(sPath));//App.Path
! P4 E; t- N, G: q. }; c/ ~        strcat(sPath,"\\");6 ]$ {  w2 G, M6 O/ c0 }# l  M
        SaveDialog1->InitialDir = sPath;
& ^3 _) r+ c3 J( ~) E+ v. b        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";4 p4 p# @1 ?7 H5 f
        SaveDialog1->FileName="fileTo.BIN";4 I0 w8 n4 i; @: p* h8 W) y+ b
        if(SaveDialog1->Execute())' E- b$ c7 ?# R$ k8 V* `
        {
# m* ~; }+ J& S6 N2 ~  B6 [" ^" X$ E. n                strcpy(sPath , SaveDialog1->FileName.c_str());
8 a% b) }, M' M) ^                stream=fopen(sPath,"wb");" V3 o- ^8 Z# f3 M
                for(int i=0;i<BIN_Byte_Len;i++)+ g2 }( u% O% H
                        fprintf(stream,"%c",&BIN_Byte);  //save file
! ~8 T3 x& J. u7 u                fclose(stream);8 X# l/ V* L: L) a  `2 H
        }
& B7 s! V) n5 _; [/ }        free(sPath);. r  O9 C3 `( D+ e4 Q" t; u& j
        free(stream);6 ?0 r6 C2 x( X7 d
}, @$ Q0 B8 |! S2 w& h
//---------------------------------------------------------------------------
8 D. q' ~9 L# ~8 E2 v, e7 V% Mvoid __fastcall TForm1::FormDestroy(TObject *Sender)5 t% C8 K- `: v6 S
{
# G8 ]1 Z1 x- B3 q2 x        free(BIN_Byte);' y$ O* N  N* ]
}, e4 k' l- U- W0 g, N; r0 f6 R. d
//---------------------------------------------------------------------------
% E5 X1 k& Y/ [) N/ E+ s5 {4 q; S
$ n* ^( K/ K7 |" Z打開一個檔案,再另存為另一個新檔案2 k. s4 {0 r1 h( _
結果兩個檔案內容一樣) _1 |( k/ r" {" Y! ^& f/ `
順序不一樣了
, i0 U, d8 r' N7 w# _檔案前面一段內容跑到結尾去了9 r8 D- }3 V4 X$ ^  f) J' E
就像下面的情況
/ B6 _' D4 a/ ?6 k* W原來檔案內容:ABCDEFG, s& [/ P% v: a5 D
新檔案內容:CDEFGAB
$ R/ Y' i1 J1 C9 D老大救救小弟哦
  t- x5 N  i$ `! a/ C[attach]208[/attach]
作者: kenneth    时间: 2004-6-9 13:05
<>怎麼一個人也沒有阿</P>[em03]
作者: kenneth    时间: 2004-6-9 17:41
<>這個是對2進制文件的操作</P><>我用的是一個字符一個字符的操作方法</P>[em04]
作者: kenneth    时间: 2004-6-9 19:13
<>問題解決了</P><>不用回了</P>[em01]
作者: high_hill    时间: 2004-6-15 15:14
<>不知道你找出的问题在那儿,我判断是alloca和malloc的误用。c++中对指针(内存)的操作总是容易出错,这些系统函数的使用,最好先仔细看看help。</P>
- f5 ^5 @0 p0 S; m$ @2 C% ~2 [<>alloca:</P>4 E, b5 ^/ U7 V3 n( D
<>Allocates temporary stack space.</P>
9 x, v. h' _9 f- i<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P># [" T; V& S7 C
<>malloc:</P>
/ V! w& f7 U$ n* w, a) V<>malloc allocates a block of size bytes from the memory heap. It allows a program to allocate memory explicitly as it抯 needed, and in the exact amounts needed.</P>
  I; U" O! H. c" `" `$ r  N<>Allocates main memory.The heap is used for dynamic allocation of variable-sized blocks of memory. Many data structures, for example, trees and lists, naturally employ heap memory allocation.</P>
5 o) o4 q- ?* h( o5 m: t3 N" F# [3 s- Z6 @) I/ D5 R* M
<>以下是改后的代码</P>
. S% h; t% k: t3 ^2 X3 j; W<>//---------------------------------------------------------------------------</P>
  z& f7 M3 Y( x<>#include &lt;vcl.h&gt;8 U# C" c4 \# P3 N- f; C! o
#pragma hdrstop</P>
* w. {: o8 c, W9 y<>#include "Unit1.h"
! M7 }* c0 C  ^2 ?3 B8 z  w+ n2 z#include &lt;fstream.h&gt;
0 D3 `9 n3 J* c, u+ G#include &lt;dir.h&gt;# Q* y# r1 h3 H/ l8 S
#include &lt;sys\stat.h&gt;" b* F/ M) s% ]
#include &lt;malloc.h&gt;
; H) {. j8 X. c# v//---------------------------------------------------------------------------
( L) O/ n5 m% [! Z' K#pragma package(smart_init)
& @/ D: |! }& N8 t8 f5 w, B& R6 b#pragma resource "*.dfm"0 ?7 k- j7 d4 |
TForm1 *Form1;
. [, n' `% e2 E& M3 M9 c        unsigned char *BIN_Byte;2 z$ H9 E: o" T- Y
        long BIN_Byte_Len;
9 f! }$ V" t. u" V, n4 e//---------------------------------------------------------------------------8 _5 `, ~0 g# s+ H
__fastcall TForm1::TForm1(TComponent* Owner)
' {& w5 U7 C9 A0 B( B$ t3 g        : TForm(Owner)
; X) |4 l4 R: e{+ k  w5 Y. K) Y$ X4 j- |
}5 j2 g1 U: L$ z2 _% @
//---------------------------------------------------------------------------
( J$ y( q5 R: E, Y& E8 cvoid __fastcall TForm1::Button1Click(TObject *Sender)
8 o7 u$ n1 s1 L7 x{- m* j4 H3 L/ T; A' H
        char sPath[MAXPATH];
7 O- T) v4 I/ f4 c! O        struct stat statbuf;
" L: C2 M0 d3 L$ b        FILE *stream;</P>6 M+ E' o! W1 B4 E$ c2 Z
<>        getcwd(sPath,sizeof(sPath));3 U! b2 l1 ^' D, ?& P- {& G
        OpenDialog1-&gt;InitialDir=sPath;
( N) h! d7 W* M; m  n        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
' X) U2 I. R0 x5 {+ W$ V        OpenDialog1-&gt;FileName="fileFrom.BIN";1 Q+ }" V4 C' {( z
        if(OpenDialog1-&gt;Execute())) w* R- m. N, C$ m- x- H& g
        {/ v5 o3 u7 j& x  d. h, {
                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());  x6 X8 C' u7 f4 e/ ]7 I
                stream=fopen(sPath,"rb");* Q* ?  h' m) t
                fstat(fileno(stream),&amp;statbuf);  J# l0 M, w# p! d+ Q( h6 k
                BIN_Byte_Len=statbuf.st_size;( n; u* L% i: J+ G
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);6 j1 N+ {$ E8 \, l+ k( `
                for(int i=0;i&lt;BIN_Byte_Len;i++)
; x: d8 l1 Z, p0 J! R2 O* |                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
* l1 f2 y% h0 C  P& V" H9 U: a                fclose(stream);2 F/ F6 u# y: J! I/ D
        }+ K* w/ G& m' K8 P) [
}) U/ W4 ~4 E4 o! r' Z5 R# x7 k. F, ?
//---------------------------------------------------------------------------
$ N1 P0 q5 O5 g& Uvoid __fastcall TForm1::Button2Click(TObject *Sender)
: j" }8 Y; k$ N1 w{% V$ ?' \" _3 S  u& x
        char sPath[MAXPATH];2 `' ~. o2 @5 e8 {2 a5 K9 Q
        FILE *stream;
  X; a( m" Q% e8 X. \        getcwd(sPath,sizeof(sPath));//App.Path
) }" ?: s( K3 X        strcat(sPath,"\\");
1 C" P7 e- G8 r+ ?        SaveDialog1-&gt;InitialDir = sPath;# \: J+ M5 N# f  E5 \3 @3 R
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";. l4 A7 B9 L; d5 \! Z& `- V' E# ~+ r
        SaveDialog1-&gt;FileName="fileTo.BIN";" w; [$ I& z1 ^3 |
        if(SaveDialog1-&gt;Execute())
5 T. j# i! N* X2 c. F        {
/ o9 f$ A6 N$ f; k( k) |& P                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());( i% Y/ V$ V: L& c
                stream=fopen(sPath,"wb");
1 x) t# O- T7 t! s& K                for(int i=0;i&lt;BIN_Byte_Len;i++)
3 w! x7 x( Q2 d5 x/ T6 U                        fprintf(stream,"%c",BIN_Byte);  //save file
& u$ N2 @9 Q$ R5 S                fclose(stream);3 S  y3 R% I6 l3 F3 [9 c
        }
2 O/ _) L  p# F        free(BIN_Byte);- B9 |4 S4 c. L' m
}- H. `/ I, e* ]3 |# s* _5 m
//---------------------------------------------------------------------------
/ f. g: ~& P: s" u7 evoid __fastcall TForm1::FormDestroy(TObject *Sender)
. ]8 t& [4 P1 J- l( }{8 l4 u; p/ o2 u8 z
        if (BIN_Byte!=NULL)
4 q% @( }1 l, J- c             free(BIN_Byte);: _) w8 f7 W# @& G5 x5 q
}
1 Q# l1 ~; \7 W# g" D4 h//---------------------------------------------------------------------------
; K4 W3 k% m* p/ ]2 F- N3 a% S$ c</P>- M2 u) P+ l" \" Z7 n6 J
<>free(sPath); free(stream);此两句也有问题。</P>
/ x1 q3 `' W! B<>char sPath[MAXPATH];不需要释放;</P>! ^- b& Z- j/ j1 w
<>fclose(stream)已经起到free(stream)的作用</P>) n3 L9 _3 l8 a
[此贴子已经被作者于2004-6-15 15:16:40编辑过]

作者: kenneth    时间: 2004-6-18 10:23
<>我已經改成塊處理的方法了</P><>謝謝你</P>[em01]




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5