QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2427|回复: 5
打印 上一主题 下一主题

老大,簡單的文件操作程序,不知道錯在那裡!救命阿

[复制链接]
字体大小: 正常 放大
kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;* j+ u4 N# g" e! L7 Q
//---------------------------------------------------------------------------1 M2 {$ o( h5 V  q

' B+ Y0 |8 j( C& K3 a% d#include <vcl.h>; t" T; |+ X" [+ u3 J9 R0 E9 C- z& a
#pragma hdrstop, M- r" Y0 _4 C& p9 g. o8 l
/ y+ x3 i5 R, `* c
#include "Unit1.h"' n5 X8 i# o# {1 R; M1 Y: f
#include <fstream.h>3 M. K0 I' r0 U, X$ |2 @& z
#include <dir.h>
2 q9 d3 R" ^2 L- h# `" a. r4 V#include <sys\stat.h>( ^# K( E; r$ z4 k. b& u
#include <malloc.h>
" E2 d3 Q$ @4 G//---------------------------------------------------------------------------
) @) F. g: W; n0 @# U0 S#pragma package(smart_init)* E4 Z6 _% H- b9 W" g' d
#pragma resource "*.dfm"
  [! D0 N# P3 I8 t$ bTForm1 *Form1;% a4 C& X* Z* R6 Q  H
        unsigned char *BIN_Byte;
: e8 Z% ?# g/ x8 k        long BIN_Byte_Len;
+ K3 _0 {+ J% i! ?- s//---------------------------------------------------------------------------
- [  l% X# C7 X1 @! ~, s% Z__fastcall TForm1::TForm1(TComponent* Owner)
) C' n7 j. [( n% T* r! u        : TForm(Owner)
$ _0 b0 }# R7 @6 c' j  {+ T2 M- G{% z1 R! b2 v/ K' J& c& R! ]- Z/ K
}
# ]$ _* E7 H1 o5 W! ^" s; X//---------------------------------------------------------------------------
; z! b$ t6 B' ~3 j/ Z$ \+ Fvoid __fastcall TForm1::Button1Click(TObject *Sender)
- V; a; n  \% Z* [1 L+ E' x3 ^{
' G5 A0 R3 P* ]2 c8 j        char sPath[MAXPATH];; S5 u2 m# J) N" M6 y) l
        struct stat statbuf;
) Z' P7 z+ [7 Z" \        FILE *stream;2 x; O5 ^) M  g0 F' L
/ B" r* u+ [0 }+ J, ?
        getcwd(sPath,sizeof(sPath));- w6 i- U+ [" j
        OpenDialog1->InitialDir=sPath;
/ j' d/ N+ C+ ^; i* h        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
& J1 B" m) B) \/ q7 q- E9 q5 E* X* g        OpenDialog1->FileName="fileFrom.BIN";- x1 [( {% y' D" W4 V
        if(OpenDialog1->Execute())
* E# e& G0 P3 @  g: e6 y        {
/ v+ C  C$ l7 M0 e) z' b                strcpy(sPath,OpenDialog1->FileName.c_str());
4 F0 A" R; P% L" X1 C                stream=fopen(sPath,"rb");
6 t" j& n$ I, _                fstat(fileno(stream),&statbuf);5 N1 `+ l' \1 S% l# q4 w
                BIN_Byte_Len=statbuf.st_size;
, e, g0 H% r% B3 ]3 v0 E; {% ~+ H6 V                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);
& y: d4 P2 X: n. V- C+ z                for(int i=0;i<BIN_Byte_Len;i++)
! K, }; v2 |& g                        fscanf(stream,"%c",&BIN_Byte); //read file4 A5 c" B. U/ q  U  B
                fclose(stream);
8 ]' z' h$ P5 _" ^        }) j% |( |/ |( n& h$ {% e
        free(sPath);  u5 X. h0 l9 _1 D: a
        free(stream);
- C  B- E* b  H8 z- T}
2 H" z; C* y1 D4 ?//---------------------------------------------------------------------------% d; r0 m9 `; H! ?: _
void __fastcall TForm1::Button2Click(TObject *Sender)
" B( y0 N8 t7 ]( a' O{+ \' ~6 f3 A5 Y$ w, S) Z+ [* W
        char sPath[MAXPATH];
9 d) g, q$ G, _  ^        FILE *stream;
  ]& R! u! b3 L: z( l        getcwd(sPath,sizeof(sPath));//App.Path
. [  G2 U' I5 R7 j! z* }# F        strcat(sPath,"\\");
, L# R4 `: A6 e        SaveDialog1->InitialDir = sPath;
. {  F& Z! N! L# B3 e        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
6 X! s: e9 q/ y        SaveDialog1->FileName="fileTo.BIN";
, d! y3 H7 D8 o+ m        if(SaveDialog1->Execute())1 z4 ~$ T6 y  z) I- b( K
        {' W: a% c( ^1 U6 ?! D/ B4 b
                strcpy(sPath , SaveDialog1->FileName.c_str());7 r5 d7 z' z2 A3 E) Y# r6 E3 `4 l
                stream=fopen(sPath,"wb");! t% t( v" n4 ]1 \; J% I% N1 b
                for(int i=0;i<BIN_Byte_Len;i++)
) g6 K4 d& s0 N                        fprintf(stream,"%c",&BIN_Byte);  //save file) q' v4 R: ^( u' |6 M+ P2 f, J
                fclose(stream);
" k  M4 e  N. \7 e0 N        }
( |( n' K% {# t! x        free(sPath);+ y+ g! M2 A& a: A3 Z
        free(stream);
' g  F, l5 A# c% E! [/ G; _}
; m, G' L+ z' r  q//---------------------------------------------------------------------------' V/ y! T' f' j- J4 g  s% d- P
void __fastcall TForm1::FormDestroy(TObject *Sender)/ U8 u( M8 x$ j) l: ^+ C, ^+ d% O
{
/ |' j2 o+ g, l2 N% D        free(BIN_Byte);
3 j/ |, g  h( c+ K9 L6 h. M}
$ U+ u1 ?" s* i5 F//---------------------------------------------------------------------------- p; D1 |+ d' _& |% F; t
! M3 L5 K7 q' t! v
打開一個檔案,再另存為另一個新檔案" G4 d4 u' v: Y
結果兩個檔案內容一樣% N5 M  U8 d- L) U
順序不一樣了
5 C/ g) d! z" S/ B4 T8 O/ e檔案前面一段內容跑到結尾去了5 `$ V1 T2 I' a6 D% }& V7 E; A; x
就像下面的情況
1 P9 ?" J! o, G# I7 ]. H  W; m. C& L* O3 I原來檔案內容:ABCDEFG
( Y4 w+ q7 H: U, G% U2 F9 q. [新檔案內容:CDEFGAB
3 s% W  }2 [( v% T老大救救小弟哦
+ s/ u3 ^/ I# ^7 W' B
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
本人方年22,学识渊博,英俊潇洒,七岁学文,九岁习武,每外出行走,常引美女回头,帅哥跳楼!
kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

high_hill        

0

主题

0

听众

19

积分

升级  14.74%

该用户从未签到

新人进步奖

<>不知道你找出的问题在那儿,我判断是alloca和malloc的误用。c++中对指针(内存)的操作总是容易出错,这些系统函数的使用,最好先仔细看看help。</P>5 W! m8 x$ a, J  R2 V0 p
<>alloca:</P>
* V8 y( c5 f" ~9 T3 g<>Allocates temporary stack space.</P>
0 B7 o3 V4 {4 v% c. F6 R, D" G<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>/ a9 B7 o0 Q! D
<>malloc:</P>. a* i2 U# i4 u; v" A6 v1 s
<>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>& D+ h& c- b" L8 N' S! C1 y# x
<>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>
; t$ d; L) E5 V& F9 }* a5 i' d6 _+ N9 H& e) X
<>以下是改后的代码</P>, F: u, s5 a% R
<>//---------------------------------------------------------------------------</P>
5 N7 W2 S) T) N5 C* L! V<>#include &lt;vcl.h&gt;
) P2 _5 l5 p* S' e7 I& l#pragma hdrstop</P>
& O6 \& D1 _6 I5 _" w$ E8 D<>#include "Unit1.h"
5 H3 n6 R2 ?0 y4 M#include &lt;fstream.h&gt;. S# l9 k' F. o
#include &lt;dir.h&gt;: }) o8 L0 ~2 ~3 h* }6 [4 c( D
#include &lt;sys\stat.h&gt;
0 m" D# t9 @5 z. c# Y* j; e#include &lt;malloc.h&gt;2 N# x* r% B3 ?; h, a9 n% f
//---------------------------------------------------------------------------# m  g$ C# o! s. n3 [4 _1 Y9 m
#pragma package(smart_init)1 H! S/ h9 ?( p, _4 u' v) i
#pragma resource "*.dfm"$ w! c! p3 O% u  I, A+ g1 |
TForm1 *Form1;3 S) G$ x$ M1 q
        unsigned char *BIN_Byte;
! I4 J( Q/ Q( W! o1 i8 N/ L2 q9 g, @        long BIN_Byte_Len;
9 G3 a. m; I5 B8 W& Q* H//---------------------------------------------------------------------------" Z  G0 l5 M. B% P/ j8 }
__fastcall TForm1::TForm1(TComponent* Owner)
) }  V8 ~6 }- x        : TForm(Owner)
6 v) f- v  n9 o% Q7 B+ V{
% \" F, j8 S/ q+ B}
9 w/ G3 U/ m) U( X//---------------------------------------------------------------------------
( \' ]4 O' r9 C5 Y' }void __fastcall TForm1::Button1Click(TObject *Sender)5 l$ `1 N. S$ n! _6 \1 D" L5 |
{
0 E" p# F6 X! B1 j' q5 T        char sPath[MAXPATH];* `1 k, T; r- W  q* B0 f
        struct stat statbuf;/ T# c- f' m4 m) V# K
        FILE *stream;</P>
) b2 ]0 N5 `# t) n* M<>        getcwd(sPath,sizeof(sPath));
* J' _9 E; {/ X+ y1 C2 a  C2 B* X        OpenDialog1-&gt;InitialDir=sPath;
; p3 s2 i: O& b' J6 L- _        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";8 d: i/ P( P8 p
        OpenDialog1-&gt;FileName="fileFrom.BIN";
4 e- A7 J, J' z/ a3 W+ c$ S        if(OpenDialog1-&gt;Execute())7 B1 s# }! F6 N) w8 J% S
        {( Y; l. ?0 T/ v- N1 K( S; t
                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());
4 y9 Q9 ?2 J' D% v& i                stream=fopen(sPath,"rb");7 F8 a2 Z% Z( \* V) q
                fstat(fileno(stream),&amp;statbuf);
8 z- ^2 y: q, K                BIN_Byte_Len=statbuf.st_size;$ U" Q: R( s; ~* {, `; l. o0 t  j
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
/ N/ G! q2 D; H2 T                for(int i=0;i&lt;BIN_Byte_Len;i++)
5 F; p  U) W- B& r) _+ K                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
$ H0 d0 j5 M( W4 f, Q                fclose(stream);
& q- c; y# z8 u& ~        }
# R, W; x1 R5 L5 Y}* m* s' T: u% d$ J- o
//---------------------------------------------------------------------------* \& l" U1 k. N# s# x2 \! }
void __fastcall TForm1::Button2Click(TObject *Sender)
6 a2 A3 b1 P  k5 a% u/ R6 q{
  h& Y* E- ]( O4 `( p        char sPath[MAXPATH];
" z& z: [% v# @2 X. D8 Y9 A# `# q% e        FILE *stream;
; W( E4 A( Q0 l) [        getcwd(sPath,sizeof(sPath));//App.Path
4 c1 X# z9 f' r, _$ g/ B3 W        strcat(sPath,"\\");- ^; y" V0 c( o: r* l' U  R
        SaveDialog1-&gt;InitialDir = sPath;
2 e5 h& u% S; P) H        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";0 j7 v8 b% [5 Y. f1 k
        SaveDialog1-&gt;FileName="fileTo.BIN";5 M! U# e- K5 c
        if(SaveDialog1-&gt;Execute())" [: G  N) }: Y/ Z" Z
        {
6 p; v( e' U( {2 D& ?" Z0 B" X9 w                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());4 ~  L1 M. y2 N9 b! Y
                stream=fopen(sPath,"wb");% ]8 P7 H, g# q1 v
                for(int i=0;i&lt;BIN_Byte_Len;i++)
. b" O. b; D; L% e9 ^# D                        fprintf(stream,"%c",BIN_Byte);  //save file
6 ?% ?9 _: V1 w% p8 i                fclose(stream);) h; s% z+ S# _( V" s0 I( H
        }; W7 I% o8 w% D% m  P4 m2 r
        free(BIN_Byte);: b1 N' U6 ^. j! O& V, Q$ H
}6 u" H2 T# O& G: u& y4 R  r
//---------------------------------------------------------------------------
% K3 s7 Q% \" dvoid __fastcall TForm1::FormDestroy(TObject *Sender)
+ t- H, e5 c7 d+ i5 E0 U9 S: m* F3 ?9 ]{# i! f+ Z8 h  v# z2 G
        if (BIN_Byte!=NULL)7 i' K, f4 u% N2 L& x6 \
             free(BIN_Byte);
5 Z0 ~+ m2 y8 \( @5 ]}
) w' o2 V" q8 ~1 u1 F( c  Y//---------------------------------------------------------------------------
1 j. P3 g. L3 k% _$ U" D( Q</P>  a/ i" N3 L) x
<>free(sPath); free(stream);此两句也有问题。</P>
/ @) l" M% X3 T1 a1 f( u% ^<>char sPath[MAXPATH];不需要释放;</P>
( h+ w7 j9 q4 g8 K( ^<>fclose(stream)已经起到free(stream)的作用</P>
# {- S- X: c2 ?. D7 w: X7 {% J
[此贴子已经被作者于2004-6-15 15:16:40编辑过]
回复

使用道具 举报

kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-20 10:04 , Processed in 0.698064 second(s), 83 queries .

回顶部