QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;' g8 V+ e, c" x7 c& [
//---------------------------------------------------------------------------
1 [  U0 A: {6 q$ b; L. R4 [& [! C4 b! @6 R! f* F- Y- G
#include <vcl.h>
) c* o7 D# j- X" M& X7 i#pragma hdrstop
' y: }0 W9 }# _" c3 ]. k+ G. e  k1 h/ b0 L* K( `' t
#include "Unit1.h"2 S0 [: z# }! Z' F9 V. h! Z
#include <fstream.h>
3 x5 Q& E% i9 A9 m! b/ V#include <dir.h>! j+ E$ j# P) @
#include <sys\stat.h>" _) R7 k  A% R, O3 h% O
#include <malloc.h>$ o& n* o, K# L& k' j
//---------------------------------------------------------------------------
4 K* b# v4 V6 I+ N. d7 J  z#pragma package(smart_init)
) d9 Z# U- \. L$ v. `#pragma resource "*.dfm"
# s' n" n6 |1 Q/ `) z5 ~' w: cTForm1 *Form1;
+ a2 X8 j) z; i' J; A+ E        unsigned char *BIN_Byte;3 d5 A2 h& |- U5 m, X
        long BIN_Byte_Len;3 u! P# k- a7 t* }
//---------------------------------------------------------------------------
" j* f- k' ?1 @- P__fastcall TForm1::TForm1(TComponent* Owner)
! {, D8 Q9 I+ ]1 |) r; h' J        : TForm(Owner)' A  N# x( F$ r9 y1 T
{
) p( F0 _" ~  N4 j}
' `, \8 W1 j+ z2 Q//---------------------------------------------------------------------------1 W2 b& N. J! g
void __fastcall TForm1::Button1Click(TObject *Sender)9 O9 t  J: Q( u4 N: W  p2 ]: c1 Z
{
: ^2 d1 a) M9 e6 w1 X" y9 \+ x        char sPath[MAXPATH];
' i& A/ D% C2 J2 f+ a: l1 \        struct stat statbuf;5 y0 J. J( A3 \; M) Q
        FILE *stream;( y4 K6 t7 d2 Q% P' J
7 `7 r, H4 Q* s4 {
        getcwd(sPath,sizeof(sPath));
  j  }, S2 g0 n- K        OpenDialog1->InitialDir=sPath;
' B: p7 i2 z! s) G" r3 Y        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";' r+ E7 u. c" z8 f. q4 D2 w  `: W5 V
        OpenDialog1->FileName="fileFrom.BIN";  y# E0 U6 P5 x$ y8 W7 c5 T0 P3 q
        if(OpenDialog1->Execute())
& z. T$ P" [, ^: v% z* }9 Z1 V. A; K        {% `, B) `6 o, E' s' u9 J6 C* Z
                strcpy(sPath,OpenDialog1->FileName.c_str());
& W8 ^+ b& Y, k7 ~                stream=fopen(sPath,"rb");
/ q* p+ F4 V- \6 Z6 l4 m                fstat(fileno(stream),&statbuf);2 Y+ I" O  V) g2 Y
                BIN_Byte_Len=statbuf.st_size;. E8 N8 _8 x3 D' f" ]! v/ O
                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);! C; @/ |2 i# R4 |( J$ ^  |
                for(int i=0;i<BIN_Byte_Len;i++): W2 N; S& ~: E. K
                        fscanf(stream,"%c",&BIN_Byte); //read file
# M" [1 ^, [/ _& x8 C2 o  Y7 r                fclose(stream);
: K( I5 ~' q: k% _        }
  [& ]8 ]7 |+ ^# u, W4 q8 b! c        free(sPath);
; Y& c- N' b* T) u: {        free(stream);9 L! i3 h! r- x/ I0 }! V+ c
}- v8 q/ E5 ^* ^- [) p
//---------------------------------------------------------------------------  ]7 ?- e# }) q0 {5 b3 T
void __fastcall TForm1::Button2Click(TObject *Sender)' O2 A0 k2 V! i0 l1 _1 L1 d( X" @# p
{
& H% g. k' I, L3 [9 [1 n        char sPath[MAXPATH];6 [. Y, }2 N1 W$ j4 x
        FILE *stream;5 b, h. z0 j+ o- |7 q
        getcwd(sPath,sizeof(sPath));//App.Path: I! v0 n2 z% [2 A; D
        strcat(sPath,"\\");
  p6 [; {3 D- c  [, D+ j: t        SaveDialog1->InitialDir = sPath;5 V4 R' ~8 N/ A5 r2 D  ~: t
        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
  d% S8 j8 e7 x  {        SaveDialog1->FileName="fileTo.BIN";
3 R1 r5 C; P, e& G2 ]. h; ~  F$ X- a        if(SaveDialog1->Execute())6 F: Z. S' N* C4 }2 Q1 o
        {1 a# v0 b& v0 Y, Q5 s: n1 D8 u
                strcpy(sPath , SaveDialog1->FileName.c_str());
5 @; a3 p. y+ C+ K+ A: l                stream=fopen(sPath,"wb");7 U+ s) T0 R+ x  Z
                for(int i=0;i<BIN_Byte_Len;i++); ~3 }' @& a# \9 Z
                        fprintf(stream,"%c",&BIN_Byte);  //save file
* d. P3 C) K1 |  _5 ]                fclose(stream);
8 i& t: e5 C! E$ Z5 k        }  g! n! `, I& E& ^
        free(sPath);
) q: a6 G3 I& m        free(stream);
2 b" k& E# e1 J1 a- N: H}  d0 |: U" e+ y. v
//---------------------------------------------------------------------------
) ^" M  P# \( m6 q% M% [  Fvoid __fastcall TForm1::FormDestroy(TObject *Sender)
/ a) k' `% _/ E# E{
% q7 J  W+ ~: `) u  D7 L9 I7 Y        free(BIN_Byte);
( O5 {: H5 F6 U}
1 m7 m1 y+ T7 e1 R7 J//---------------------------------------------------------------------------
& q/ L  j& t  }% {% t- _2 v' N! _1 V4 M$ y
打開一個檔案,再另存為另一個新檔案
5 Z5 w4 J7 F5 K/ |7 Y結果兩個檔案內容一樣
7 X) \/ O9 [- @7 w; `. z% B3 s1 |順序不一樣了, e6 u1 C- y  ~8 y  Y
檔案前面一段內容跑到結尾去了
5 y+ p  u! ~. A/ K# C9 c. s就像下面的情況5 D4 J$ z! q* r- u& i7 ]/ |# K( f6 i- }
原來檔案內容:ABCDEFG
' _8 H: j! T# Q$ \& N新檔案內容:CDEFGAB
7 D/ q) j# ~  k" Y8 M: k! Z9 p老大救救小弟哦
+ K% J4 H, @. {/ g
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>0 k6 @2 _' h: Z7 f9 ?
<>alloca:</P>% V4 P! j7 O! i8 i0 j/ L
<>Allocates temporary stack space.</P>* O7 T+ f8 Z4 n+ V. `/ L
<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>0 O1 c4 X; q2 U2 _4 R
<>malloc:</P>
8 |# e& O. y1 G% i<>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>
& |6 i5 |3 V* U. F1 X! 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>
, Z* ?. z  L0 P% j& g% Z  R, C8 n; }: x2 S5 U9 z$ N8 ~
<>以下是改后的代码</P>' Z9 c1 @2 r, C- p* E' N
<>//---------------------------------------------------------------------------</P>
6 v$ S$ `) |! ], i' M<>#include &lt;vcl.h&gt;7 X9 f+ M$ X3 U6 _; ]
#pragma hdrstop</P>$ p+ B" h7 X. i: b' C/ P
<>#include "Unit1.h"( _/ \) x$ Z+ _% f) c7 j
#include &lt;fstream.h&gt;
0 |$ I8 `- g3 I& o  W7 T4 G3 x% C#include &lt;dir.h&gt;* ^1 P) \! p" O; Z- D1 `
#include &lt;sys\stat.h&gt;
1 k2 W# r3 c) X" z6 N: H! \#include &lt;malloc.h&gt;, S* Q  s# H! E8 Z5 |8 a' c
//---------------------------------------------------------------------------& x4 s, L! _+ {, _( j8 k
#pragma package(smart_init)
4 `: L! I/ x3 c& m. t6 E#pragma resource "*.dfm"
) D$ s% A9 W5 V. e. jTForm1 *Form1;/ V7 \9 k1 z4 ^: x% u6 J
        unsigned char *BIN_Byte;
5 }+ A% ]- M- u- Q: x9 p4 f        long BIN_Byte_Len;
0 z, f7 j6 z  m+ U//---------------------------------------------------------------------------4 E: C( g3 p$ K4 l0 J4 P6 ~
__fastcall TForm1::TForm1(TComponent* Owner)* M2 V$ d) f1 [' n) f9 g6 s+ K
        : TForm(Owner)
) S! L  ?5 R; x. U' C2 R{
( S( w, Q# ^- ]5 b}
, Q1 \' r' o3 z7 E//---------------------------------------------------------------------------3 D, J- G8 h: j+ W# S8 r, \$ ]
void __fastcall TForm1::Button1Click(TObject *Sender)
/ z8 r. z! J' T0 L2 B2 ]5 e{& r' [1 k1 N5 s5 {- y' J
        char sPath[MAXPATH];# L2 h* @: `+ ?, @# ^$ h1 T9 n
        struct stat statbuf;, s. {" `: c8 U; w2 k5 i  G
        FILE *stream;</P>$ L$ D0 m% i) n6 t
<>        getcwd(sPath,sizeof(sPath));
. X1 A0 \3 l' D) S; ?- d8 K5 q0 u        OpenDialog1-&gt;InitialDir=sPath;
9 h5 S( M( ]" }7 F0 B6 M! z! W        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";. X* Q: n! |9 e3 H; a* H
        OpenDialog1-&gt;FileName="fileFrom.BIN";! ?' H& ~9 p2 b6 t/ c
        if(OpenDialog1-&gt;Execute())$ ^3 g% r0 L) u5 c6 k' ?0 ?8 J; b+ R
        {
8 W5 s" W  W; f4 E                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());
6 \( }; }1 `0 U; A                stream=fopen(sPath,"rb");5 p( w; U' i: H' y9 W8 b9 y* j
                fstat(fileno(stream),&amp;statbuf);
/ \+ j) G" N1 {( m. m, R/ I" k                BIN_Byte_Len=statbuf.st_size;5 J/ k5 w8 M, p6 u& V
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
( t; l( B% X( h) H- R, y% E                for(int i=0;i&lt;BIN_Byte_Len;i++)1 ~) y% t4 w& b6 k! b% P
                        fscanf(stream,"%c",&amp;BIN_Byte); //read file, ~! R3 g+ Z+ ~: Z: _
                fclose(stream);
, [' z9 i% R6 C        }* |. k  B: K% H0 ]7 @
}+ J; U9 q( I7 P% G7 K
//---------------------------------------------------------------------------& t5 U9 A4 _/ p0 D( M2 O
void __fastcall TForm1::Button2Click(TObject *Sender)
5 j1 V1 \) U3 V* O& ]8 {; J{5 q: P  q/ b6 l
        char sPath[MAXPATH];
& ]: [1 _3 a% X        FILE *stream;
1 X* C1 i9 a, A8 o        getcwd(sPath,sizeof(sPath));//App.Path
* w+ ~3 k/ O- t; h4 X        strcat(sPath,"\\");, p  m8 e3 b, f! {# g' m
        SaveDialog1-&gt;InitialDir = sPath;+ D9 ~5 p. @" E6 o- L. Z5 _
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";6 u" j$ s; R/ h+ ~* b$ ^5 c
        SaveDialog1-&gt;FileName="fileTo.BIN";% y$ P3 l  D  u7 j  H5 Q
        if(SaveDialog1-&gt;Execute())
( P8 A% k$ b3 Q# Q& t        {& o! {1 [% ~) d2 D) t( a9 y2 ]
                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());% e" C* E9 P# Q0 q& H! [( @0 w
                stream=fopen(sPath,"wb");: k, i1 h! p" \9 d
                for(int i=0;i&lt;BIN_Byte_Len;i++)
3 E" A3 |, E$ H1 R7 M                        fprintf(stream,"%c",BIN_Byte);  //save file
/ ^) q4 r" Y" c1 a7 g9 e                fclose(stream);
9 G; j3 m/ ?: A3 s2 e1 M        }
7 B* q5 w( I; z        free(BIN_Byte);4 x9 Y2 y/ q$ H9 `4 I& T7 S) m
}
8 C2 y, C2 u  F4 C2 G' h! Y//---------------------------------------------------------------------------
, N/ t% P0 ^: Gvoid __fastcall TForm1::FormDestroy(TObject *Sender)* s/ r7 }9 R4 T
{) N9 ]1 Y6 V7 t# j8 r
        if (BIN_Byte!=NULL)
1 j1 |) @; _$ G6 I4 w6 d+ V5 M6 h4 r             free(BIN_Byte);7 H; E' X: |9 h% F  [
}
4 h. ?2 E6 G5 g9 U' v. K( V2 R//---------------------------------------------------------------------------
1 {, [, p) o" y</P>  q' s  c/ {6 W0 w; ]9 A
<>free(sPath); free(stream);此两句也有问题。</P>4 n2 x  Z7 U8 W7 b: i5 y
<>char sPath[MAXPATH];不需要释放;</P>9 V- C+ L* L4 C- @. T2 f% N
<>fclose(stream)已经起到free(stream)的作用</P>( k9 |& i/ j& s3 x& [7 ?. s; r$ Z
[此贴子已经被作者于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-10-25 13:16 , Processed in 8.314354 second(s), 83 queries .

回顶部