QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;
: {) w& l6 u/ m* Z. s" d) P& u//---------------------------------------------------------------------------' B: n/ C- n/ ^& ^: w- r8 [* X& V4 ?
$ e1 k( b0 B6 s; C) E, t4 Y
#include <vcl.h>, e) a& y, Y; Y5 o
#pragma hdrstop& W' z' ~( U' V0 o. h- ]  K; F

; l" y. ]& w, {2 U3 S8 u# ^& U#include "Unit1.h"
; O7 m* L3 i' j- ]: t+ D7 G#include <fstream.h>
$ m# Z3 D" Q) T#include <dir.h>
5 O  p1 H% N, j. L/ T: h#include <sys\stat.h>' D6 j5 m0 ?: M$ g& X( i) B- @
#include <malloc.h>
) s9 ?8 F$ |+ H! ?! Q( ]& ?' B//---------------------------------------------------------------------------
. Q  k: Q. Z; j+ Q4 m5 k! @5 c#pragma package(smart_init)3 d7 [" k& B1 d- Q8 `; \
#pragma resource "*.dfm"7 M' J. A$ o3 _
TForm1 *Form1;
; I! ^: q8 a( O        unsigned char *BIN_Byte;
/ ~) O7 t* j/ l4 }4 J        long BIN_Byte_Len;' D: v% G4 t& ?% Q
//---------------------------------------------------------------------------
. S6 u- f& a  ^) e. j9 X__fastcall TForm1::TForm1(TComponent* Owner)* j: |- x: T# D: S9 ^4 |
        : TForm(Owner)
" i( v" s% d# d0 g: d4 M{2 m; S8 w( B2 z. X4 ^4 ?
}- n: \: J  }4 j
//---------------------------------------------------------------------------! j3 _; _% ^9 h
void __fastcall TForm1::Button1Click(TObject *Sender)
5 M* a* |# ^! _3 B+ A{, `% r: o# }" \
        char sPath[MAXPATH];
+ ?) r1 W0 Q5 a$ R6 }- v        struct stat statbuf;
7 I0 B# O5 `/ e5 B        FILE *stream;7 d  j6 o* j2 o- U- j
# o- \5 D  ^5 Q& _$ X! L
        getcwd(sPath,sizeof(sPath));
7 |: B3 }4 P/ r4 C" I        OpenDialog1->InitialDir=sPath;
7 R$ N: x' R, ]        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
/ \, ?. K7 c# i6 {8 D/ U        OpenDialog1->FileName="fileFrom.BIN";
5 Z5 p+ ~0 s3 U* w2 T5 Y* l        if(OpenDialog1->Execute())& \( ]8 k5 Q+ i
        {
& U# f& t) v  H: S! V  S/ d                strcpy(sPath,OpenDialog1->FileName.c_str());
4 x8 F- C' O- q: I: K- R6 ~                stream=fopen(sPath,"rb");$ ?. }% O- K& t
                fstat(fileno(stream),&statbuf);
+ U8 I8 Q' Y  I1 B5 h                BIN_Byte_Len=statbuf.st_size;/ z$ L* b8 C7 W( W9 q; H* K
                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);
. n6 N8 O% H4 G- I2 A  o( Y                for(int i=0;i<BIN_Byte_Len;i++)" C- S/ k! m! M/ o" u5 h5 w
                        fscanf(stream,"%c",&BIN_Byte); //read file
& m/ A% X. n: }                fclose(stream);
% @8 y( O: H8 u        }% E4 B5 ], T; J% D+ ]
        free(sPath);$ J) ]2 }1 g1 [+ x& I! X
        free(stream);3 c; Q: v) w: }4 V
}
+ A% J0 ?  R( p, \( X. l//---------------------------------------------------------------------------
, {; X; ]6 A4 n$ e  Dvoid __fastcall TForm1::Button2Click(TObject *Sender)
% m# _- v' J5 i5 L{; W' {/ m; _7 I% Y. c7 X. o( L( R
        char sPath[MAXPATH];& |8 h4 q: [4 v
        FILE *stream;% ~; W- f. v6 u3 i
        getcwd(sPath,sizeof(sPath));//App.Path: k( y6 i1 u2 s+ F. T
        strcat(sPath,"\\");9 b% c  T  |6 F/ l
        SaveDialog1->InitialDir = sPath;
( J  c3 e/ r3 b        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";8 h) x$ u! w0 j/ V+ a
        SaveDialog1->FileName="fileTo.BIN";/ t0 b; W0 P3 V/ a3 _9 M
        if(SaveDialog1->Execute())
( i5 D# X2 E3 e9 A8 |" U        {
4 U' P! _' H2 d. w5 A                strcpy(sPath , SaveDialog1->FileName.c_str());
; P5 S; u* R' p0 o9 A. s: [                stream=fopen(sPath,"wb");# U2 k- r) s% v: Y
                for(int i=0;i<BIN_Byte_Len;i++)
2 Y/ p8 J$ H' }. O2 q: G                        fprintf(stream,"%c",&BIN_Byte);  //save file
- m! a# f8 D7 H  J9 [2 @1 {                fclose(stream);& J: k  o+ p! m
        }
! H# ~# ]/ u& I$ r, S) y( S        free(sPath);/ K; \1 f3 ?6 }% f
        free(stream);6 r- a3 g$ R2 Y- p5 l
}3 {2 |% I+ w# p& l
//---------------------------------------------------------------------------# u8 i% M0 I8 |5 v) [# F0 x
void __fastcall TForm1::FormDestroy(TObject *Sender): i1 ^( x7 b0 G2 G6 R" K
{. J1 h: A2 z" f" u3 D, f6 a5 ?5 g
        free(BIN_Byte);6 N* k3 j4 L/ m+ V
}
/ N# O( `# y; g8 k0 a( i//---------------------------------------------------------------------------
; y% ?6 _( a/ B) K% X( i% U# t2 O9 e6 D
打開一個檔案,再另存為另一個新檔案# r- l& P! o" h2 h4 s
結果兩個檔案內容一樣
5 F% J6 d3 g8 S7 t+ J順序不一樣了
& d: q; j6 ~8 H# Z! g6 Y3 D檔案前面一段內容跑到結尾去了
6 o% |, w6 k' P* J就像下面的情況+ @0 R' N4 d( ^& U/ D  E% F( E9 n
原來檔案內容:ABCDEFG
+ X% T8 d: l' M9 G3 i& Q6 h新檔案內容:CDEFGAB
& B2 z. n( r: Z7 @6 {2 i( k8 ^老大救救小弟哦
9 `: f* N+ j- ^" G8 A( ~2 d
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>
6 ^  J9 B& c/ ^7 s<>alloca:</P>8 s0 J) A. }( b4 l! ~
<>Allocates temporary stack space.</P>
2 U2 F2 U! K$ Z8 |* ~) E; ]. H- c<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>* t# L' O  ?- O9 Z* }
<>malloc:</P>
1 v( |( U; ?" i& m/ \/ K/ `/ b2 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>4 X1 y! @+ }* `! h5 u* o8 J: v
<>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>4 L, c$ D$ \6 G7 U( ~% ]: ?
+ m" h7 A8 a7 n/ A% s9 _  t
<>以下是改后的代码</P>
& d! B' d# z0 G<>//---------------------------------------------------------------------------</P>
! y* z" x; i; W" ~<>#include &lt;vcl.h&gt;3 C" \4 ~. O6 W; A$ L
#pragma hdrstop</P>- l& X5 M, j, ]' p" {
<>#include "Unit1.h"1 ^! L2 r. D  @; _
#include &lt;fstream.h&gt;% P/ w' e' F6 x  ]% M( o0 J- o- ~
#include &lt;dir.h&gt;
, b9 B4 p. b( G+ _#include &lt;sys\stat.h&gt;
& z" t; j/ ~# r8 P, a. }#include &lt;malloc.h&gt;
1 F, ]+ N( T2 r8 Y//---------------------------------------------------------------------------4 |) l6 m$ T/ g4 p
#pragma package(smart_init)4 `0 ^; Q% f  k; T" M( J* r
#pragma resource "*.dfm"
. F, I  g: t) U. L$ v, JTForm1 *Form1;. y3 ]4 E  C; Z: ?& g
        unsigned char *BIN_Byte;
! x- N" a& t0 |/ K, w2 Z        long BIN_Byte_Len;
/ }# [( X# z1 s, s# M+ j! m//---------------------------------------------------------------------------% n* y: P; `' X( I
__fastcall TForm1::TForm1(TComponent* Owner)
8 X3 o9 ]' _2 I3 b! K2 w        : TForm(Owner)
. n* u2 y( T7 H' h4 N, r6 x% _{9 c: r) B) I" A4 O+ |
}! C' T, b+ p/ X% W
//---------------------------------------------------------------------------5 `; I2 `' Y9 p5 H* ~$ {
void __fastcall TForm1::Button1Click(TObject *Sender)
- Q; }! S4 P& b8 x2 T1 z3 W2 \, z{8 X8 R8 ]4 S9 g, L6 F
        char sPath[MAXPATH];2 n, ]/ {6 l( \
        struct stat statbuf;! [% n* U4 ?5 J( h# b
        FILE *stream;</P>: Q8 }. z6 H* S
<>        getcwd(sPath,sizeof(sPath));6 T# \+ {- {# |4 y" m+ i  l* o
        OpenDialog1-&gt;InitialDir=sPath;" \' h$ Q7 x* v
        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
9 r& Q+ B" g" Z5 f        OpenDialog1-&gt;FileName="fileFrom.BIN";9 l2 c! c7 H! v4 d. V' n
        if(OpenDialog1-&gt;Execute())
+ f, x( J% U+ k" k% L/ R        {
) |6 z9 p# c- K0 T" N* i. h/ L                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());) |  I) l0 Z# Q9 \5 |6 V8 ^
                stream=fopen(sPath,"rb");, m3 W6 \( x& S
                fstat(fileno(stream),&amp;statbuf);
" b9 N  O5 y% S. U& R                BIN_Byte_Len=statbuf.st_size;
: t+ F4 }5 P' W1 z8 S$ P6 O- F                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
5 E' a2 I8 t: q" T2 m; x$ s                for(int i=0;i&lt;BIN_Byte_Len;i++)
% ^- o" u2 g; h' t8 [                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
. x- K: u; y4 h8 J* y1 D- R# O! `                fclose(stream);
+ \( {% l4 [+ O  u( X* |        }0 T4 {( Z* T  P& C6 k1 n
}
7 @# i2 K; J/ L//---------------------------------------------------------------------------7 i4 y) x8 x* R: M+ K! k
void __fastcall TForm1::Button2Click(TObject *Sender), R1 _+ Y5 v" _8 O! ?& o1 }  s
{
( O: w- \5 o; e2 n# Q        char sPath[MAXPATH];
4 O* l, B, C+ {1 Y  f* ~# p        FILE *stream;/ N% O3 w1 A8 q# n" A
        getcwd(sPath,sizeof(sPath));//App.Path
7 g6 X: R* m7 `' @; b$ U        strcat(sPath,"\\");, E7 U! y  S1 i9 c# f
        SaveDialog1-&gt;InitialDir = sPath;) X7 v: ^' N6 K. K7 H/ c
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";9 n( g2 J, W8 K" Q: c2 h3 R2 g
        SaveDialog1-&gt;FileName="fileTo.BIN";& g9 `# H  U! C: t3 C
        if(SaveDialog1-&gt;Execute())- X8 ~/ F8 G' y, R; l* `9 y/ A
        {
, n$ f: b/ U" o; r) U* @8 k  L5 u                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());
& |7 m* G' \- \                stream=fopen(sPath,"wb");/ f  p1 O) s5 G+ V
                for(int i=0;i&lt;BIN_Byte_Len;i++)( ~/ E( r( I3 N
                        fprintf(stream,"%c",BIN_Byte);  //save file
6 k3 B) H' ?( P9 w. Q$ s! A                fclose(stream);
* x2 m7 O$ n6 k$ \7 T        }) o1 b: @0 d! x" T9 X
        free(BIN_Byte);
- B; H  u7 U2 i6 W0 q: m}
( h$ `' P3 `# Z5 ?5 D//---------------------------------------------------------------------------
3 c; S' t7 z  m: e5 avoid __fastcall TForm1::FormDestroy(TObject *Sender)
# [4 z& p# Z$ [" m{
% c6 f. q' l6 I( t/ R! a0 U        if (BIN_Byte!=NULL)
, l2 T1 y+ H2 Q5 ]7 s4 `; Y             free(BIN_Byte);- C8 w& U% [5 a' {: t0 A: Z/ E2 D
}6 O, P4 K7 K% _  `
//---------------------------------------------------------------------------) r! K2 g) P, f
</P>
- N: R  y6 y+ v6 X! Z<>free(sPath); free(stream);此两句也有问题。</P>
% k# m4 K) A( E# b1 S4 t& I<>char sPath[MAXPATH];不需要释放;</P>: B7 k; Z4 A" e+ @, f) s
<>fclose(stream)已经起到free(stream)的作用</P>, c1 _4 Z% _7 M3 p0 q7 g
[此贴子已经被作者于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-23 09:50 , Processed in 1.542784 second(s), 83 queries .

回顶部