QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;
, C$ Z0 G9 G+ i2 y//---------------------------------------------------------------------------; X% b" j9 Q+ [6 t4 q; ?' F7 i  y- k

" ^' a) B; d* f  \#include <vcl.h>
2 o4 S' X5 [' j' ^3 N#pragma hdrstop
% S( ?2 A" j- d8 ~5 y  d: Q
- y/ ^, s+ W- X8 S1 m- m#include "Unit1.h"
) D1 S# z/ X. s" [9 V7 \#include <fstream.h>
# L0 ^6 g8 g) C$ Q2 ^, \9 I9 K8 F7 F& u#include <dir.h>
' A: C- E" d* A( e* `#include <sys\stat.h>
5 _- V, N% J$ i; A0 m" J#include <malloc.h>7 t+ P; A. p5 w5 {$ w5 [
//---------------------------------------------------------------------------
& ~" c2 z  c9 L8 A" ~( U#pragma package(smart_init)& A' H# e( ^. c4 l0 }4 ]/ H
#pragma resource "*.dfm"
! q! F( z) f6 Q8 }TForm1 *Form1;
0 o* O/ w9 z+ O7 E2 L# y        unsigned char *BIN_Byte;) a- @9 `3 N- _  G
        long BIN_Byte_Len;3 ^8 k* C( ?6 w; v
//---------------------------------------------------------------------------
. B+ T3 L: [/ ?* m& B! t. r__fastcall TForm1::TForm1(TComponent* Owner)1 m; ?8 G, y- e1 T& o
        : TForm(Owner)
' E) s8 R0 J% g2 `{
( y" R* Z. |" u7 D, w}9 {3 i5 A4 V1 l. k4 P2 L
//---------------------------------------------------------------------------' l' o+ e/ r* x
void __fastcall TForm1::Button1Click(TObject *Sender)
# f0 K! c1 B/ T. q* M1 r( A" E{
5 U+ n9 M6 @) `- s5 h  [& X$ b3 M' x        char sPath[MAXPATH];6 F) F( P6 M  z
        struct stat statbuf;
/ m# Z, X, f. E# y# ]+ I: `; a        FILE *stream;
* P% B# x" d' j) k5 d% a2 y' M: y  j( i& f. Y: j) Y& ?7 K
        getcwd(sPath,sizeof(sPath));7 \! i* X+ `8 K) D
        OpenDialog1->InitialDir=sPath;7 A! C- m. q0 Q
        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
$ M7 g% B) l4 B3 i* M( Z        OpenDialog1->FileName="fileFrom.BIN";0 k" W8 B. E/ V7 i
        if(OpenDialog1->Execute())" ~: S1 e, L* a
        {0 s4 K3 U4 `6 }$ z
                strcpy(sPath,OpenDialog1->FileName.c_str());/ h: l  I8 J# [: M$ x6 q: x
                stream=fopen(sPath,"rb");% Q! n) e% G+ n, k! c
                fstat(fileno(stream),&statbuf);
! u9 S9 q9 n  ?" [9 R# Z, t9 M5 s8 J: I                BIN_Byte_Len=statbuf.st_size;
- l9 u, q# j. k" e                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);
% j4 _6 h3 w6 ?4 E# U                for(int i=0;i<BIN_Byte_Len;i++)- E" T) W0 s5 w9 r6 w7 \
                        fscanf(stream,"%c",&BIN_Byte); //read file
) f1 p: v. O. @8 a                fclose(stream);
# p) J3 V- |* e' w- P/ t5 H        }
+ R0 X* u0 g/ X! b- {6 p) s0 b        free(sPath);
! ~% I4 d+ m" E  ^" f4 u; g% \        free(stream);0 g$ c7 K; D- t1 v/ ^
}- b) @* I  x  l: t, \
//---------------------------------------------------------------------------! M  w9 B& n" E7 R- T# g2 U% d9 F7 V
void __fastcall TForm1::Button2Click(TObject *Sender)5 F* p9 ?# j+ O3 _9 c$ M
{
+ f  ^0 q3 T9 U        char sPath[MAXPATH];
8 ^! M- }8 o. _7 ?& a* N6 k% [        FILE *stream;
; [% A" M* Z: L4 ~        getcwd(sPath,sizeof(sPath));//App.Path
6 Z! Z. x$ V3 T  @: i        strcat(sPath,"\\");
3 Z9 m- A4 N0 |( C+ K1 p* a& ^( Z        SaveDialog1->InitialDir = sPath;# z4 @' z3 [+ A* ~! u; f
        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";5 u8 G. b7 x3 N; Z0 y
        SaveDialog1->FileName="fileTo.BIN";6 B6 a8 Q; ]# y0 u2 g$ z
        if(SaveDialog1->Execute())
: |! M: Q; b+ U        {$ Y! j4 f- M5 _% m; p9 C" W
                strcpy(sPath , SaveDialog1->FileName.c_str());1 F+ a1 L& m( [8 C( E% m: I% Z4 ^
                stream=fopen(sPath,"wb");& R# y. p( ~1 w" w. w, @
                for(int i=0;i<BIN_Byte_Len;i++)
, o$ P3 L% D" ?6 w! i& U                        fprintf(stream,"%c",&BIN_Byte);  //save file
0 B+ ]: _/ x4 @                fclose(stream);
" v; {: n& ]! ^* C        }4 T5 V  P8 t8 g
        free(sPath);
! L$ {) F6 U( M" S6 G6 S        free(stream);2 W2 h% M5 a2 h
}
9 j& y# @9 l0 Y- }//---------------------------------------------------------------------------
7 J$ ?2 {3 H! ]void __fastcall TForm1::FormDestroy(TObject *Sender); L2 ~5 l0 {: t5 h; k1 s# Z2 M
{$ l% P; B, m5 U7 r* e
        free(BIN_Byte);
1 ]- E4 r- b! m$ \! }+ Z" K0 R}
: g$ X1 c  b! p* B2 L  k$ ]//---------------------------------------------------------------------------+ f5 |8 f% f1 n$ t3 R4 Q
- E% ?2 {3 O; C) x, Q
打開一個檔案,再另存為另一個新檔案
5 z" d7 S) ?9 W; K: H結果兩個檔案內容一樣
% b1 M+ w- u' \( \3 @; a1 L: P8 H順序不一樣了
! t" z& j. O# D* ^' Q$ x檔案前面一段內容跑到結尾去了8 m" J$ Y& h9 @/ w
就像下面的情況1 I, V7 U9 K, C
原來檔案內容:ABCDEFG
! C2 V: [4 I% w2 {新檔案內容:CDEFGAB
0 N" {9 A9 Q* O3 a老大救救小弟哦
3 ?/ F( a% s& m( y5 d  A* ^! u# p
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>, ~# u4 f+ q8 M4 v; ^9 E
<>alloca:</P>7 R! r$ L( {6 y) E; U
<>Allocates temporary stack space.</P>
+ c" T& u1 z" k* }/ z<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>4 @2 z" e& V8 M  Y5 [: k% K& `0 ^* @
<>malloc:</P>
" `2 X  I2 x8 u% t& E! `1 P<>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>" T9 h. J* p2 P6 Z5 ]8 j
<>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 x* O/ ~$ @, h) n! Q# i' S0 o! }; z) y, U3 [- x
<>以下是改后的代码</P>( r, Z* h2 I- p: z' ]; S
<>//---------------------------------------------------------------------------</P>
9 p- J, m3 c& s9 D) ?- `<>#include &lt;vcl.h&gt;
% L# G( |/ {% G6 T) T. o#pragma hdrstop</P>7 Q  `5 E8 i8 [8 V1 q$ Y4 W
<>#include "Unit1.h"
6 Q* t+ C+ L, m( T) k; o' z: ]/ d#include &lt;fstream.h&gt;
. |% l- b% t6 ?( B) k# }: `#include &lt;dir.h&gt;, W/ A. ^( N  H8 W
#include &lt;sys\stat.h&gt;) |/ W, z- F: R  p0 h
#include &lt;malloc.h&gt;* {* ]# d& u% ~: D- N0 C8 Q1 z
//---------------------------------------------------------------------------0 w4 A  e& x$ y+ f
#pragma package(smart_init)
6 n/ R# ^. P& H8 v8 M$ _! a9 x8 p#pragma resource "*.dfm"
5 h% u; L$ V4 A7 `1 e3 A' h! aTForm1 *Form1;1 `4 k' j* e- [$ i9 X
        unsigned char *BIN_Byte;- V) z- p, t3 v: Y  q* S
        long BIN_Byte_Len;: s' r; ^& s3 x, D$ q
//---------------------------------------------------------------------------
$ E+ l! q# G5 J- Z9 A( O6 F1 w* ?4 `__fastcall TForm1::TForm1(TComponent* Owner)
5 S  w/ R8 o/ B/ f! d& _        : TForm(Owner)
( H4 S4 B, H1 o; o% m% E- O9 C5 X{$ U: s% @. L9 D3 d* k7 \
}
6 N+ I4 t; ]3 @8 e//---------------------------------------------------------------------------7 w" j6 [0 Q$ \2 {$ W, }
void __fastcall TForm1::Button1Click(TObject *Sender)
9 \0 X+ t1 [+ l0 ]3 T{9 P$ S0 N' U7 v
        char sPath[MAXPATH];
) y# ~6 h' d& x) k        struct stat statbuf;7 v6 l% }# p, R
        FILE *stream;</P>, t, |) Z. z) k
<>        getcwd(sPath,sizeof(sPath));8 D5 J7 J' m9 J/ u
        OpenDialog1-&gt;InitialDir=sPath;- C# q. E1 t' w$ \+ k6 x
        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";, I" |# P. l& g  F" Y+ C- A0 l
        OpenDialog1-&gt;FileName="fileFrom.BIN";
1 J2 l; T8 g- @        if(OpenDialog1-&gt;Execute())
. @, L, N; M1 O9 U2 c) q        {8 |( z5 v# V1 b# H
                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());! F* f* a0 [9 U6 _3 n
                stream=fopen(sPath,"rb");
; x3 _6 m# f+ h4 @/ b. v, E                fstat(fileno(stream),&amp;statbuf);
2 x4 _) {  Z: q6 c8 t3 o                BIN_Byte_Len=statbuf.st_size;! T: C/ G0 ^3 B: Q. ]8 y5 I0 c6 v
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);- x: A8 F9 i. W# p5 Y3 G1 }, b  c
                for(int i=0;i&lt;BIN_Byte_Len;i++)8 p  V" ^: t$ u3 d5 V- R7 n/ O
                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
  K4 Z- z- _  O. S0 w, n                fclose(stream);  |( [5 v0 G' _$ q; G
        }6 |* @! J4 U6 B1 N. ^! R
}
% T  c% c4 R* Q//---------------------------------------------------------------------------
( i0 F/ r2 |. M, Qvoid __fastcall TForm1::Button2Click(TObject *Sender)
& O2 V1 n0 h- A% n1 g2 M  C{/ h+ d7 v. x# I& [8 ]( m1 v/ a
        char sPath[MAXPATH];
) O3 L/ Q* }. {4 I4 E5 `! A        FILE *stream;9 o7 X$ Q$ [+ G6 c$ g$ P' m0 ^
        getcwd(sPath,sizeof(sPath));//App.Path
2 C. |, B5 V/ v+ ?) o2 v' ]; ?        strcat(sPath,"\\");
% [; ^2 ]  F9 U* ?# m/ d        SaveDialog1-&gt;InitialDir = sPath;6 j& ?" Q8 k, P1 q. V( m# l, s5 k
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
6 c& P" {! r8 V& J  S& I" f: P2 |" G        SaveDialog1-&gt;FileName="fileTo.BIN";
8 _( a$ b% d2 W" x. \        if(SaveDialog1-&gt;Execute())
1 r( C% [  o) b; w* Z7 M        {5 w4 C  a5 R6 R
                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());5 s0 M! T$ V- W9 R: D/ O
                stream=fopen(sPath,"wb");
, R/ Z' C% A! k2 [! F                for(int i=0;i&lt;BIN_Byte_Len;i++)# S% T3 J3 Q1 B
                        fprintf(stream,"%c",BIN_Byte);  //save file2 K  N, T: c/ a
                fclose(stream);
' {! t+ F: I7 k* X1 f9 _/ T        }
$ ^' X* q; j, x  }" E7 Z        free(BIN_Byte);5 ~4 b+ b# S6 W9 M! d
}3 [6 d+ C4 [" v% _- F5 `+ w. n
//---------------------------------------------------------------------------( v0 m: Q2 l6 ?7 j) }% Z- ]- @% z1 E
void __fastcall TForm1::FormDestroy(TObject *Sender)- o1 P) |0 o, i! X& z
{
4 O6 I5 X$ R7 G( t0 K" A# R        if (BIN_Byte!=NULL)% @1 L. Z+ _& H! k3 q0 R7 j% z" J
             free(BIN_Byte);
& ?# ^8 B3 z, F. o! ?% g: C# V}
$ ]# ?1 B7 W. ?' I//---------------------------------------------------------------------------
$ E  D8 A+ \* n$ r- J7 L</P>$ b+ j) K( v% h( Y
<>free(sPath); free(stream);此两句也有问题。</P>. T1 [+ b& @0 |7 h
<>char sPath[MAXPATH];不需要释放;</P>
1 ^2 q9 t. T7 O5 h( Z<>fclose(stream)已经起到free(stream)的作用</P>$ L  L& ~4 _7 p! I) _* |' c2 a" @
[此贴子已经被作者于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-6-13 03:30 , Processed in 0.711384 second(s), 82 queries .

回顶部