数学建模社区-数学中国

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

作者: kenneth    时间: 2004-6-9 11:41
标题: 老大,簡單的文件操作程序,不知道錯在那裡!救命阿
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;
7 Q: j0 J3 _1 f4 Y! ^1 [//---------------------------------------------------------------------------" l8 E+ S, J) C% X+ O; f

4 R2 d3 I' g& j3 e#include <vcl.h>2 z5 D" \6 D0 M" @. w
#pragma hdrstop
0 N0 G1 M) a( O* l( l% b
, ]4 P3 \* }! I( a2 N#include "Unit1.h"! ], w2 v; z' J! r5 v( _8 g4 q
#include <fstream.h>
% W8 u9 s. z& a5 U/ \* K/ y6 _#include <dir.h>
% G2 ^) y7 e& i% j8 q2 E#include <sys\stat.h>
, e! \! S* Q  r, C- [/ _#include <malloc.h>
$ N6 P; K" T9 L9 l//---------------------------------------------------------------------------& r* L% e! u$ R( o4 c+ I; K; A
#pragma package(smart_init)
' {4 {6 \' y4 |& y; k/ I#pragma resource "*.dfm"
7 W7 L' ?/ q) A1 W% w% p6 FTForm1 *Form1;8 {! o7 {) u# q, E3 N
        unsigned char *BIN_Byte;0 m" V2 I) J6 H- M
        long BIN_Byte_Len;
7 H0 F3 F0 q3 v: L$ U/ n//---------------------------------------------------------------------------5 e2 Y" f( U  t8 [) s! a  s
__fastcall TForm1::TForm1(TComponent* Owner)
! R) [- v! ~# t5 N  t        : TForm(Owner)
: }6 u* C( R3 _1 o{
# y5 \$ I/ n' i# i; K}
) ^* @: t( `# w//---------------------------------------------------------------------------) Z0 i4 M0 l. Y
void __fastcall TForm1::Button1Click(TObject *Sender)
6 R8 l2 m# e' S, _* q' f{& y  L  X! Z1 n2 T( {1 w, m
        char sPath[MAXPATH];6 ]' D  A3 u3 ^& d1 H8 [. L
        struct stat statbuf;
4 F( R$ j3 h7 j1 t1 o5 }        FILE *stream;/ Q$ R, X1 w$ Y( B  Y/ t9 |( |% O

+ e* L. _4 r/ V        getcwd(sPath,sizeof(sPath));
; l& @( p5 W/ m5 m  |' I0 F        OpenDialog1->InitialDir=sPath;
* Z( @5 ^6 B5 A1 P" i6 `$ b        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
9 f4 `0 [5 F: y1 j5 x        OpenDialog1->FileName="fileFrom.BIN";7 a( K: W$ _; Y+ `8 b
        if(OpenDialog1->Execute())
5 H+ i/ x& D% x# E) L5 R8 z9 x        {
; z" E/ Q, K2 ]9 ~4 K                strcpy(sPath,OpenDialog1->FileName.c_str());) Q8 `3 q" m/ I: K: d; |1 q
                stream=fopen(sPath,"rb");
1 a. q8 x* \$ f/ W7 K8 X                fstat(fileno(stream),&statbuf);8 Z7 H9 x, q' X3 q6 @* P9 A& z8 a
                BIN_Byte_Len=statbuf.st_size;# o. |9 q4 H$ _$ r
                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);/ V) g' Z# L! l6 ~
                for(int i=0;i<BIN_Byte_Len;i++)1 n4 c) B/ G' W) i- K" `' P
                        fscanf(stream,"%c",&BIN_Byte); //read file
  x$ H* m! `3 E3 q; l5 |' M                fclose(stream);4 p5 d8 ^2 ]; y9 d2 H
        }
' y4 r. f3 [$ E, J# A( V        free(sPath);! w# m  x5 @' \* o% L3 ^, t
        free(stream);
% o0 G6 r( E7 e1 D/ ?( v  U# d}% S1 f5 Q- X! l8 I
//---------------------------------------------------------------------------
8 H3 W& h  e' J% [( \void __fastcall TForm1::Button2Click(TObject *Sender)! @6 L8 M/ i0 t. z! e
{" j6 B3 }+ T8 [" V* Z( H
        char sPath[MAXPATH];+ u/ \$ b. S4 K) C1 r, R
        FILE *stream;+ x( A8 ~% [9 f3 F1 Z5 M- {
        getcwd(sPath,sizeof(sPath));//App.Path
" Q( _/ j& x/ e/ O* B' i        strcat(sPath,"\\");: E3 y/ A8 n: y7 V( l
        SaveDialog1->InitialDir = sPath;
; p* x& K! R, k8 T        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
3 w6 h2 y& X8 Q; M3 j        SaveDialog1->FileName="fileTo.BIN";
! }6 ]& }( U* c/ {$ n) u3 x        if(SaveDialog1->Execute())
. i$ b/ Y4 @. T" J7 L        {0 n7 D' a4 i# c+ s4 p: {6 e
                strcpy(sPath , SaveDialog1->FileName.c_str());- o! r3 H* T) Y
                stream=fopen(sPath,"wb");
1 @$ |: _5 ?' Z4 H                for(int i=0;i<BIN_Byte_Len;i++)5 ?' N" ?6 Z# N
                        fprintf(stream,"%c",&BIN_Byte);  //save file
! K7 g1 q6 e1 M  v' ^' o                fclose(stream);8 m& H0 ]6 A& ?
        }3 V5 T: }; A7 H6 v9 b3 ~
        free(sPath);% \; v. N* m, \# ]$ t3 n
        free(stream);
* _" S: k7 A/ R" G  o6 `$ ^}
+ l6 O1 P2 P+ ?//---------------------------------------------------------------------------4 `5 d+ h3 q7 V2 ^
void __fastcall TForm1::FormDestroy(TObject *Sender)
: n. }$ u3 ~: H) ~{/ w% T9 z1 y( |& S- s
        free(BIN_Byte);
2 W' V+ q, h2 A}
: `9 s+ S# V- B: b  O, [4 |//---------------------------------------------------------------------------
' o6 u4 B" W2 i& j% M. H
% Y; e# J7 t# p% g# `5 ]) L& W打開一個檔案,再另存為另一個新檔案, a; K- @5 s4 I
結果兩個檔案內容一樣
3 c; d) a* O" g* Y( J0 o+ g順序不一樣了
( |0 M! t/ O( ?6 ~" K3 y檔案前面一段內容跑到結尾去了
7 X* e7 H2 H* X7 \" P4 l2 x; f5 @就像下面的情況
" W2 \4 N! v& [原來檔案內容:ABCDEFG
% }$ n% C" Z/ F新檔案內容:CDEFGAB
+ Z2 D" n3 v9 p! G; I老大救救小弟哦& c5 S  F. }# ?. X; @( }5 ?# x
[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>
; a& `7 f. e% A4 H' C<>alloca:</P>
: A3 s6 f2 j! G! K, V3 h<>Allocates temporary stack space.</P>" v3 W2 q* r: n! G' F
<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>
$ d$ E# [- f0 w0 L<>malloc:</P>. N! R& u. F2 q, v, z2 x+ x" i/ X" R
<>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>
3 v' Q: G# ?$ K<>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>6 J/ @, b9 W+ h: A% D1 l* ~' M" k

" g7 [  z' Q+ |( r<>以下是改后的代码</P>! A! a/ W$ L0 u. Z' k
<>//---------------------------------------------------------------------------</P>' t7 h" J5 W9 H' F& S- ~2 j2 @8 J) A
<>#include &lt;vcl.h&gt;" A1 f$ [# E& U4 C0 P
#pragma hdrstop</P>7 v  {0 {- D9 s+ |2 c2 w
<>#include "Unit1.h"
# A; x# ~$ K1 ^' i  I#include &lt;fstream.h&gt;" O  E# ]) b9 x
#include &lt;dir.h&gt;
6 Z% b+ ?2 ]8 X& _* j) S#include &lt;sys\stat.h&gt;% z4 u2 s4 r7 ]
#include &lt;malloc.h&gt;3 f* b# b( d# s. a5 ?3 F
//---------------------------------------------------------------------------' I1 I; c# f+ J; g. J( E
#pragma package(smart_init)
+ p! k6 q) P. Z" x#pragma resource "*.dfm"
4 O1 q9 \/ S0 xTForm1 *Form1;3 R. H8 p$ |5 o
        unsigned char *BIN_Byte;3 y) \! q0 ?0 @% y1 }
        long BIN_Byte_Len;- ]: y9 ]8 _0 [4 e& c: M  \
//---------------------------------------------------------------------------4 Y7 T# z5 ~0 g  \
__fastcall TForm1::TForm1(TComponent* Owner). z" C3 v* S7 _' R- F, @- {
        : TForm(Owner)  D( O4 \: k/ J0 }' x' q5 x$ [
{
4 C2 W3 N0 M. S& r! V2 R}- M0 J. b/ Y  `# U* B0 K3 F/ c
//---------------------------------------------------------------------------4 Y' n+ r8 k: \
void __fastcall TForm1::Button1Click(TObject *Sender), V( `3 R  l7 ~7 }
{+ v) i/ w7 @6 y0 e7 |6 [5 p
        char sPath[MAXPATH];
- E, g+ ^  \1 V' i3 \8 D6 t/ Z        struct stat statbuf;
) m. f. i  C8 w/ c% ]% z$ H6 ~        FILE *stream;</P>
1 A' |- @8 `/ I& X<>        getcwd(sPath,sizeof(sPath));
$ {) e; _$ v7 D        OpenDialog1-&gt;InitialDir=sPath;+ _* t$ c" M* F9 s0 j$ z: w1 k, F$ o
        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
: Y. K5 S0 O* S+ p        OpenDialog1-&gt;FileName="fileFrom.BIN";
' x: q, q' m9 Q        if(OpenDialog1-&gt;Execute())
/ ?: H' Z- U0 H. H7 R        {
3 m9 U; u% w, M. [6 k7 [" k3 j                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());1 K8 M# z/ V& @' X5 l8 I( S8 b
                stream=fopen(sPath,"rb");1 f1 q1 q- ^3 q0 v
                fstat(fileno(stream),&amp;statbuf);: Y" |$ O2 U% c! t1 g, I
                BIN_Byte_Len=statbuf.st_size;  \! r2 ]$ t9 F- g
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
3 b" t5 P- p) ]! l5 {5 _' l6 G& m                for(int i=0;i&lt;BIN_Byte_Len;i++)
: V0 j# m3 o& J$ d                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
: ?* m" V4 e+ R3 i; k2 [                fclose(stream);
' b  P( f  W7 J$ q1 e        }% z3 G2 m8 v4 X# \* V/ R" o( r
}: u- J( @7 y) p1 P* B7 T$ R- x
//---------------------------------------------------------------------------
3 Z: D4 |0 `. Xvoid __fastcall TForm1::Button2Click(TObject *Sender)
( {' D* m) g9 {{
* m+ [4 v+ l$ L( Y0 K. h- Z        char sPath[MAXPATH];
; Q1 V4 t! ~" G. q6 I4 y        FILE *stream;
) a* W# r3 d) w( |2 Q) W4 W        getcwd(sPath,sizeof(sPath));//App.Path
+ u4 C" F+ T3 l- |. f+ E" s- K- q        strcat(sPath,"\\");
8 k0 N& k& S; d, V4 f        SaveDialog1-&gt;InitialDir = sPath;& r  I1 l/ A  L: c
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
* e& d$ r- r; K. }3 p2 p        SaveDialog1-&gt;FileName="fileTo.BIN";0 g- T$ X3 w6 G( Z! P: {2 K
        if(SaveDialog1-&gt;Execute())6 U, m! m4 W3 J4 b
        {
7 x6 ?% i1 f/ Q- e( G                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());
7 N5 [& j, `) a                stream=fopen(sPath,"wb");* Z% B- B2 {  L
                for(int i=0;i&lt;BIN_Byte_Len;i++)
* r5 Y- ?, ]/ W! ~                        fprintf(stream,"%c",BIN_Byte);  //save file5 M" y: S" u9 e0 U( t
                fclose(stream);( P( v& @- v0 p+ c! ]
        }! M# ~* Z- k% K+ r
        free(BIN_Byte);) |& R5 {# {3 @2 W0 N- {
}! K  H) l" K( o6 b
//---------------------------------------------------------------------------% A, W6 Q7 ^, K$ p( S' @7 d  T
void __fastcall TForm1::FormDestroy(TObject *Sender)( p8 i, Y! p* C# A
{
8 {' b4 V$ c4 K" F        if (BIN_Byte!=NULL)& k" N( J9 [! N9 `& F+ n5 o
             free(BIN_Byte);# b- P2 G9 g$ G1 v. J8 N* R/ l
}, v4 i3 A( |. [  v  I  L/ }
//---------------------------------------------------------------------------
$ I: O' y  v: N. M% M</P>; o8 s7 r1 E3 u8 I, E9 j' S4 I/ `
<>free(sPath); free(stream);此两句也有问题。</P>
. t/ v! w/ X  U, i<>char sPath[MAXPATH];不需要释放;</P>
; c. u) F4 F2 K# Q' X! _0 [<>fclose(stream)已经起到free(stream)的作用</P>0 F. U/ y, ]0 y# n4 n, ~! n
[此贴子已经被作者于2004-6-15 15:16:40编辑过]

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




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