QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;: D% ]  [: x3 D5 x
//---------------------------------------------------------------------------1 P' E9 ]( z4 q! R1 R# M

& A  f; c/ `- y6 z2 b" l8 |% [#include <vcl.h>
( j6 R* F: A2 J$ x0 ~8 O#pragma hdrstop1 |4 [2 }# ~0 P0 b! C/ p+ p

- T; b, j+ n: T' y; \$ Y1 y+ u#include "Unit1.h"  e- h3 k+ D" K( o$ W6 q4 j8 c
#include <fstream.h>
0 B: z! i9 ^8 z' ]#include <dir.h>
# {) _( u; E# _6 K#include <sys\stat.h>( t: \5 Y, ?0 N, v+ O% S4 F- b8 B
#include <malloc.h>
8 m: {% V/ R; }& \7 g//---------------------------------------------------------------------------+ w: Z& U( z8 o$ i
#pragma package(smart_init)& y8 Z4 a/ ^& |7 N7 e: Z# Q
#pragma resource "*.dfm"
/ I7 U4 o2 M$ d  NTForm1 *Form1;
' i2 b) p, f9 S6 ~6 O0 {0 A+ s$ g        unsigned char *BIN_Byte;
: @1 J7 v5 M+ l, h6 V7 ?        long BIN_Byte_Len;
/ q7 K" x( u9 ]$ Y, }0 q0 q//---------------------------------------------------------------------------: s4 C* C# \( `, e& `
__fastcall TForm1::TForm1(TComponent* Owner)
9 m3 c" q! q# n9 c- ?        : TForm(Owner)
) q3 d# ?5 L! f% ~8 B" O8 _{
' i, g! B" A# _1 i  A% B+ j}6 b, h4 \8 Q' s/ J
//---------------------------------------------------------------------------- `8 J, n: F" i
void __fastcall TForm1::Button1Click(TObject *Sender)- D4 E1 ^: Y  T8 k
{6 o0 o2 ~7 ~. E+ F$ Y
        char sPath[MAXPATH];
6 r, e7 Y% A# q. t' u  d        struct stat statbuf;
5 B4 y) u' S0 a2 Y+ C        FILE *stream;
8 `' m3 T2 v7 W! [* Q" Y
7 I) _6 o4 y5 ~        getcwd(sPath,sizeof(sPath));
0 q. y* t3 h  Z; `  H        OpenDialog1->InitialDir=sPath;2 F: o/ X2 H- r% Q1 \1 O% F
        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
' k4 ?! [! @4 i, c# i        OpenDialog1->FileName="fileFrom.BIN";
4 ?( o( Z# X3 p2 P        if(OpenDialog1->Execute())+ v; A) L$ `9 |" i. b) ^
        {
1 g' _& Y. T! f+ a. Z$ v& P                strcpy(sPath,OpenDialog1->FileName.c_str());
* t3 d2 ]' e  s7 |: C                stream=fopen(sPath,"rb");
" H( L# n/ Z% e4 X                fstat(fileno(stream),&statbuf);4 g" J3 l# m) u! _3 X- X& d6 @
                BIN_Byte_Len=statbuf.st_size;) T& H7 J+ j) a, T; |
                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);
2 e! `7 l  o4 Q& f                for(int i=0;i<BIN_Byte_Len;i++)* l/ V" |5 o7 Q. C1 J  t
                        fscanf(stream,"%c",&BIN_Byte); //read file7 h) R8 L& ]; b5 z: j6 E! G( m
                fclose(stream);
9 v" O1 X4 J$ c9 S        }  B& }7 z: E/ u! q- b  J, |3 N# x
        free(sPath);. G+ r: t7 d* |% u( e: q3 R
        free(stream);
2 Z3 K, N7 u$ U5 I}
: V9 Y: {  e4 q$ W& `//---------------------------------------------------------------------------4 ?5 ^0 j% }2 A# h) C% z
void __fastcall TForm1::Button2Click(TObject *Sender)
! Z" A/ B% Z& ?. ], N- ?2 r9 ?{% `& O  y( S! c. P
        char sPath[MAXPATH];% i3 u0 a' A  r0 J* P
        FILE *stream;* @# }+ v3 Z$ ~; O6 A, z; ~7 t
        getcwd(sPath,sizeof(sPath));//App.Path
9 Q3 B6 }) w/ V2 l        strcat(sPath,"\\");
+ I6 ?  M% s* Y' j2 C9 b7 q# B- w( K' ~        SaveDialog1->InitialDir = sPath;$ ^; C6 t. L% i+ O5 ~9 M" E
        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";# q4 X3 b8 ~5 f; D& [4 d( o! ^% G
        SaveDialog1->FileName="fileTo.BIN";6 C4 Y3 L7 _$ f6 J$ H& P
        if(SaveDialog1->Execute())* ]% ?- @/ }* m! N: k% ~% o4 N3 b
        {, S* B8 U: k- x" e3 O- e+ f+ d8 n
                strcpy(sPath , SaveDialog1->FileName.c_str());
) r/ Z6 m% E! \3 y                stream=fopen(sPath,"wb");
- }$ ?  @9 G4 W9 R! \                for(int i=0;i<BIN_Byte_Len;i++)
/ j" u3 }2 R3 N  L3 y! E                        fprintf(stream,"%c",&BIN_Byte);  //save file
5 F6 G# K5 K% U# F! H# Z, R                fclose(stream);
' M" q; u; V0 i4 G( n        }
! `$ v& Q) ~9 B, e        free(sPath);$ f3 a4 X5 @# e1 u" v0 H
        free(stream);2 k2 q& n: W/ ?7 ]
}  A# Q1 p- b5 X
//---------------------------------------------------------------------------4 R$ y6 \! \9 g# h" k
void __fastcall TForm1::FormDestroy(TObject *Sender)
; N: w3 ~' K" O5 S) g8 I* l{# m$ G: W; W: @$ V8 T; p
        free(BIN_Byte);
3 H2 u4 @  J, L1 B  J2 x2 y, u  j+ i}
% I" V  {( q/ X7 h* X! Y8 C( x//---------------------------------------------------------------------------# N8 n% x1 j& J, p& }

0 N7 N7 U( e! b. ^' d. g& S打開一個檔案,再另存為另一個新檔案
' |  v5 N# k* k4 a0 l; _# m' O結果兩個檔案內容一樣. J* `/ [# s* ~5 L4 z
順序不一樣了
, T* p$ J' T7 N( I3 Y# b% C* v檔案前面一段內容跑到結尾去了) ^# C: j. m! @5 h5 m
就像下面的情況# d0 H4 i& ?+ R4 x9 c
原來檔案內容:ABCDEFG
: `. s% [# t) c* m. ?& s新檔案內容:CDEFGAB
/ Z* f  }. J& Y0 \7 f3 s老大救救小弟哦
0 x& @  _) G; \  G/ S: J7 Y
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>2 x3 E7 E6 j6 W0 @
<>alloca:</P>4 ~7 T+ C. ?2 _2 d# g
<>Allocates temporary stack space.</P>
! u; |9 }& \8 M1 c! d<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>' [3 R- l7 I2 n" B: b
<>malloc:</P>0 C3 i, q7 `" D: i. A
<>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>- Z; H, K" }$ t& L. G3 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>
, D9 o' c; `# s; @' d! r% Y  f. B
) W1 k: L9 b/ e7 ]# x1 F  u<>以下是改后的代码</P>- [" T% n# {) F6 O, |& j
<>//---------------------------------------------------------------------------</P>4 E- a( Y) e2 J3 O
<>#include &lt;vcl.h&gt;" X1 v4 ]  |( \& m
#pragma hdrstop</P>7 u( b) O: a, N  Q5 j. r
<>#include "Unit1.h"
* J5 X( N( y# F: O" V3 N#include &lt;fstream.h&gt;9 l; E* v9 B: s: s" l9 a
#include &lt;dir.h&gt;# S" b, ]7 i+ ~" K8 _
#include &lt;sys\stat.h&gt;
" I. l8 S9 M7 L0 k# ?9 m#include &lt;malloc.h&gt;2 I' E7 E% e1 V- n( r/ E
//---------------------------------------------------------------------------0 B" O; `- x& s$ V# x
#pragma package(smart_init)
/ ^5 t) l. \8 `1 ?+ ?6 L#pragma resource "*.dfm"
- ^) n) n( t5 c' h. aTForm1 *Form1;
; m) y, Z& \" }  P1 f        unsigned char *BIN_Byte;
$ @$ G: F( Q; U1 G5 A8 `        long BIN_Byte_Len;
3 c, U5 r0 t5 }//---------------------------------------------------------------------------. i/ n0 N, L* ]! M( e3 t
__fastcall TForm1::TForm1(TComponent* Owner)1 T/ M4 G4 x: Y
        : TForm(Owner)
8 j* K( C& E6 q; B{
( A& L3 L& g( U' i}7 S) v" t! Y! r; C6 Z
//---------------------------------------------------------------------------
: z1 D  s' i; p7 O% H$ G& m* Ivoid __fastcall TForm1::Button1Click(TObject *Sender)" o6 |: z1 r+ ]$ h! t5 X
{1 R2 G9 }4 [/ Z5 O# U
        char sPath[MAXPATH];. m1 E) C' {& i. S
        struct stat statbuf;; w. G( z* \* C: X( K
        FILE *stream;</P>
) x2 f/ g1 S( `1 I* B" ]3 N<>        getcwd(sPath,sizeof(sPath));" W8 f8 T& k; X: \4 \1 W
        OpenDialog1-&gt;InitialDir=sPath;  S2 {1 [( h" X
        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
9 h) S- d/ b0 O( u        OpenDialog1-&gt;FileName="fileFrom.BIN";
: |( ~4 `# L- O! |! D        if(OpenDialog1-&gt;Execute())2 O. d$ A$ ]3 A) W# U4 T
        {: n) w5 u: H( H; r! H
                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());
2 v9 s+ W/ S, j* j. p- x                stream=fopen(sPath,"rb");/ d( @( Y) W2 m5 F2 R3 K8 ^
                fstat(fileno(stream),&amp;statbuf);- {+ l4 R% E+ ^$ L  }
                BIN_Byte_Len=statbuf.st_size;3 I$ `0 U, S: u) w% z# z( j
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
5 E$ J) y8 Y) r! \' n) ^: ?                for(int i=0;i&lt;BIN_Byte_Len;i++)
4 C6 Q2 Y" z% e                        fscanf(stream,"%c",&amp;BIN_Byte); //read file( Q# N! {) g3 P' K! F. ^
                fclose(stream);
% x9 P. I! d* M8 u3 R        }
* O* y' ?) P0 n: @0 g7 O) v  q1 W5 T}# T& o5 \" I0 v
//---------------------------------------------------------------------------  U  d+ _; L8 Q, b7 W
void __fastcall TForm1::Button2Click(TObject *Sender)
5 U: L9 b5 K7 N, Y+ c! S: W% k{: g' @1 m( W/ @! R
        char sPath[MAXPATH];3 c2 |6 t& Y5 Q1 J! Z+ L6 T4 D
        FILE *stream;, }" {- o7 ]# M  W5 p
        getcwd(sPath,sizeof(sPath));//App.Path( _: {' d" W$ b3 R- x. i
        strcat(sPath,"\\");
. f5 d/ o/ ~7 L4 J1 O  f% ]/ e        SaveDialog1-&gt;InitialDir = sPath;6 ~# p; H( T$ {4 {8 v) @, F
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";4 `2 O- o' ?# l; O
        SaveDialog1-&gt;FileName="fileTo.BIN";' D+ p8 M  [7 t
        if(SaveDialog1-&gt;Execute())0 M# B: m; ^: f8 p# ?  ^  X
        {
6 S9 l" T# v$ r3 ]9 p  Q4 Q                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());+ A3 j2 p0 M2 r2 ~0 S5 j2 G1 J
                stream=fopen(sPath,"wb");: J' k. [/ ?/ g5 I
                for(int i=0;i&lt;BIN_Byte_Len;i++)1 }' S$ V" ~- {+ U7 R) g
                        fprintf(stream,"%c",BIN_Byte);  //save file3 p! L" ]8 y9 K* V' v: [' H
                fclose(stream);6 c6 U7 W. X* F2 ?
        }
$ t4 y& B5 a8 P# {  U3 G        free(BIN_Byte);
, _9 }. C/ i' @' `4 f}* x; H* g  e# K  N3 b" i. U- A5 Q
//---------------------------------------------------------------------------
, Q) P1 ~% m( v2 T$ b0 s8 yvoid __fastcall TForm1::FormDestroy(TObject *Sender)( S1 @1 a: a5 _5 T
{
" m5 y3 _' C6 y2 T8 u) W        if (BIN_Byte!=NULL)
4 x+ q4 e) E$ C+ U/ k             free(BIN_Byte);. D: k( z! D8 K' {# A
}5 I6 }3 q( Z, g7 Y. Z1 n
//---------------------------------------------------------------------------
$ @2 Y# h7 v, I</P>9 M! n1 H" S8 O* m- r/ V
<>free(sPath); free(stream);此两句也有问题。</P>9 i4 v! U* Z+ Z  C3 l' j
<>char sPath[MAXPATH];不需要释放;</P>
0 L4 b% n5 E! T2 M<>fclose(stream)已经起到free(stream)的作用</P>
3 N3 c5 Q! R% A( K! j6 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-4-20 18:39 , Processed in 1.562844 second(s), 83 queries .

回顶部