QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;% }  L+ C6 E! a9 P! Q% C
//---------------------------------------------------------------------------
$ S' U) u8 M2 [; X% ~9 G& o
. V7 A/ t' ?& U- f  b' Z+ \#include <vcl.h>* g) L1 G6 H! I1 `& _! F
#pragma hdrstop
& J% g! Y+ }0 q: {  R( d9 [
: E2 y" [, ~- A5 A#include "Unit1.h"* r0 J) P5 t& D
#include <fstream.h>
. Q! d' U' V) `" I, A#include <dir.h>/ N5 s, M' B0 ^+ _" {
#include <sys\stat.h>9 [" Q+ L! u. ]& c) l5 G* ^
#include <malloc.h>
8 L' c9 x; O/ e# G3 k//---------------------------------------------------------------------------
: a  N* j  n' d#pragma package(smart_init)- @* o" P/ D% u2 }
#pragma resource "*.dfm". l$ Y" N6 i4 A. ~: H: h# P* m
TForm1 *Form1;
. [3 E: k! J3 r( o& O4 \        unsigned char *BIN_Byte;
8 {; e0 w, S1 S; [) @& D        long BIN_Byte_Len;
. ?  ~$ [8 O  }$ K//---------------------------------------------------------------------------7 v/ i6 i1 n) `* n  @4 s( |* ~; A6 e/ I
__fastcall TForm1::TForm1(TComponent* Owner)
% p, N( Q/ u* D+ L5 B! Z6 a/ _( S        : TForm(Owner)
7 A" z, c$ ^7 E& X  i{
3 j- W5 q8 |' _! ^+ x( c}& Z; X. f& ^$ n$ O/ o
//---------------------------------------------------------------------------2 }$ r7 _. j+ U" q5 G. h
void __fastcall TForm1::Button1Click(TObject *Sender)) _( s% L# J+ [7 Z2 y+ v) _
{
: r  h- t/ s: N/ p! v        char sPath[MAXPATH];
) `3 t7 }* V, ]* n; T& d9 E1 A: q        struct stat statbuf;
1 w/ t7 N3 B- k% K8 Q+ z3 g' [3 x! W        FILE *stream;9 u9 b" ~7 C2 }4 [& y% l

9 y- k: x  ^) D# `! t. e/ o0 V        getcwd(sPath,sizeof(sPath));' d- @* f2 v; R9 N' P
        OpenDialog1->InitialDir=sPath;
' L: ]' E9 F) R) e) j4 a        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
  @' ^9 C$ A0 T8 w; @- ?% Y        OpenDialog1->FileName="fileFrom.BIN";5 G) @4 p* I" ?, }( }1 b
        if(OpenDialog1->Execute())" _% e5 ?8 C- R& x/ A2 W
        {& |! |/ D2 G: r$ E. R4 s- f
                strcpy(sPath,OpenDialog1->FileName.c_str());2 K+ U, X( K: P5 T/ w; b
                stream=fopen(sPath,"rb");4 Y- h+ ~% H, m# A6 F" m1 t
                fstat(fileno(stream),&statbuf);
8 j0 a# I' q/ c                BIN_Byte_Len=statbuf.st_size;
3 _5 Y" ^2 }# }' B& ]                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);
, \! p5 b  A, \0 U                for(int i=0;i<BIN_Byte_Len;i++)  E7 E" X2 O% w6 ^( B! o! V" S
                        fscanf(stream,"%c",&BIN_Byte); //read file$ h3 }1 Y" K" W" ]% q
                fclose(stream);# n; b& l& F) ]* h
        }
7 p" ]3 l) W+ ^& ~  ^5 j        free(sPath);
  M4 v7 I& r$ Q7 K# q% B! H4 t( O) x( \        free(stream);
1 Y# X# B2 G, r  K}' i$ j* L$ e# {/ Y$ v& y" i
//---------------------------------------------------------------------------
0 q$ k, r5 r$ p7 e1 Q3 ^/ {; Uvoid __fastcall TForm1::Button2Click(TObject *Sender)5 l7 U) F* |4 E- X+ }: p8 r6 `" h/ D$ _
{% a7 X+ V7 K" M- P& K
        char sPath[MAXPATH];$ v$ p5 S. g) [+ D# }8 N. x7 N+ I1 e7 u
        FILE *stream;
9 ?& s1 Z4 Z1 ^* b7 `        getcwd(sPath,sizeof(sPath));//App.Path
3 U* }9 [5 F+ W$ [, R        strcat(sPath,"\\");
% z# ]# Y/ q' c1 k; z0 b8 ~        SaveDialog1->InitialDir = sPath;
$ _0 W+ {+ }( `, R3 t9 {5 i        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";( D9 l2 d. b+ \
        SaveDialog1->FileName="fileTo.BIN";, s8 t1 e; I' z" R$ r
        if(SaveDialog1->Execute())
' s' @- d1 c, R/ h5 z4 o+ I! ]        {
! ]: R8 {) l$ W" `* g                strcpy(sPath , SaveDialog1->FileName.c_str());! ^# `: D, o% Z
                stream=fopen(sPath,"wb");5 [2 q; t5 a; v2 O) z! e
                for(int i=0;i<BIN_Byte_Len;i++)
( [, {* c+ p/ [" g. x3 D' s6 W                        fprintf(stream,"%c",&BIN_Byte);  //save file
& T- L4 x: d* Z  r" E. o                fclose(stream);' N) r+ |! m2 o( a: C
        }
6 b# k4 T5 s* j( a        free(sPath);; ^) o8 i/ e$ m4 o8 c
        free(stream);
' ]. @  j% E; R" W( D7 Q: Z" g}
3 z; \' w1 M+ h& c//---------------------------------------------------------------------------6 C$ ^1 I3 b' v, s- N
void __fastcall TForm1::FormDestroy(TObject *Sender)  P  ]; V1 J$ G+ z; P  [, ]
{# O$ ?$ P; t( |) }$ ]% O/ X( l
        free(BIN_Byte);
+ ~- G; o) O4 g+ \}
' P* e6 `2 K7 r, |" ~& a0 G//---------------------------------------------------------------------------1 Q  \" e0 L! R' B6 @  T9 c% M

" `( Y$ G6 e7 U1 J. K' A  F3 a4 v打開一個檔案,再另存為另一個新檔案- n3 \  ?0 F5 s/ m
結果兩個檔案內容一樣
& U% m) A) b: u9 u/ q順序不一樣了
/ F$ _. K& R- Y8 z" J檔案前面一段內容跑到結尾去了
  c% V4 u/ n9 q. Q就像下面的情況  S. r5 M4 _' ~
原來檔案內容:ABCDEFG
* p" Q0 u$ Y* f* n新檔案內容:CDEFGAB
8 g& E: ]5 ?/ M老大救救小弟哦; `  @0 X$ x. J" w2 h0 `2 ?7 Z
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>* O  [  Y3 Z  w1 u& _
<>alloca:</P>- U- |$ O: }2 g9 k" ?
<>Allocates temporary stack space.</P>
& I$ n# A' D+ p/ _! e, Z8 M) a<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>' M& s6 g& T+ I+ H3 X6 p
<>malloc:</P>7 |3 ]* X5 J+ O0 e+ Y8 C6 x4 [
<>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>
* ~2 [. D8 {! t" j- R<>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>
; ]+ A. w4 h9 N/ r- O! [* z5 Y, i! i" A4 K
<>以下是改后的代码</P>7 X( c1 C5 y& G) n
<>//---------------------------------------------------------------------------</P>7 u6 b! ^5 l3 }( p% f6 N  H
<>#include &lt;vcl.h&gt;
" L8 y- M7 V9 Q6 a' T9 k* @! N#pragma hdrstop</P>
* P4 s  G8 [8 q+ [0 m<>#include "Unit1.h"* L7 E+ k9 G& C) b
#include &lt;fstream.h&gt;1 ~/ a8 n8 X. A
#include &lt;dir.h&gt;; u5 Q, V! Q* N% W
#include &lt;sys\stat.h&gt;
3 J' x, @& s! A2 j8 w#include &lt;malloc.h&gt;5 V, A2 H2 J6 `/ ]: D0 `
//---------------------------------------------------------------------------
6 B( L. }, H. X/ n* _0 I! U#pragma package(smart_init)
) o: Y$ R( w  Y5 w#pragma resource "*.dfm"
% p$ B, E  ]6 E0 W/ ~TForm1 *Form1;
! F) j6 @' c, w        unsigned char *BIN_Byte;9 ^* V5 E2 I/ z8 K
        long BIN_Byte_Len;
2 ^6 R- j4 ?4 p# G' l//---------------------------------------------------------------------------% d4 |% g! C* J6 Z, B
__fastcall TForm1::TForm1(TComponent* Owner)! v; h; C+ y" @; s3 F4 M' O, u
        : TForm(Owner), |# _* r1 |3 h! q- r- W7 q4 X
{
) V* G( I4 E1 _" p/ I}. _' e& t, h3 D7 ^! B2 J: f- K( t
//---------------------------------------------------------------------------
- Z' n  S" _* a# [' ^. e) p3 @2 Bvoid __fastcall TForm1::Button1Click(TObject *Sender)  E/ D5 T" [; z4 c3 q
{
' C8 X* A: ~( o( K4 J' a( ^; R        char sPath[MAXPATH];
; g! S3 Z1 h, `: U7 a$ ^        struct stat statbuf;
# y3 z3 v+ ^+ j/ u! U1 s' x4 B8 F        FILE *stream;</P>
0 K+ C3 r/ Z7 f0 ~<>        getcwd(sPath,sizeof(sPath));
6 m# U# A* E) A$ i$ d3 v- g        OpenDialog1-&gt;InitialDir=sPath;
( \, I9 S( Q  [; n& `: ]! {        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
8 b* Q' g: b! H        OpenDialog1-&gt;FileName="fileFrom.BIN";
! b. l/ a3 r9 p% [# E        if(OpenDialog1-&gt;Execute())
6 X' O  G( B# p  o        {
6 Z/ g; s4 Q3 L' P9 q8 M                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());
2 u" i1 Q3 ~/ G: t3 ?: U2 q* B1 W7 Q                stream=fopen(sPath,"rb");, P) k! f) c! f
                fstat(fileno(stream),&amp;statbuf);
) n1 B0 D. ~  O  T5 g: E                BIN_Byte_Len=statbuf.st_size;& s6 e. k5 D2 v$ i  T
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
/ p6 [" ~+ a! E2 F% C. X3 n                for(int i=0;i&lt;BIN_Byte_Len;i++)1 K2 f* t7 y+ B! [; b; B5 ]6 e
                        fscanf(stream,"%c",&amp;BIN_Byte); //read file  M* F" n" t4 I6 J1 l. ^
                fclose(stream);+ x+ {+ B$ i- v1 X7 j/ L& ]& k# t
        }
, A; Y: {" K4 m4 v: k  w# _}
- z6 T5 T1 A" q6 X6 m8 B//---------------------------------------------------------------------------
, ?6 S5 N8 L" D' d" }( P1 M# cvoid __fastcall TForm1::Button2Click(TObject *Sender)$ k6 @7 V1 Z4 F( p9 G
{
3 }0 P  @: I2 q* c0 J" x$ n        char sPath[MAXPATH];9 c  }1 r+ [8 Z- W  o$ h# R
        FILE *stream;6 H+ _  J0 g1 A$ k- W- @9 p# G
        getcwd(sPath,sizeof(sPath));//App.Path
3 N' l( f# O) V! u% B# {        strcat(sPath,"\\");$ Q* p2 }7 A. Z# }
        SaveDialog1-&gt;InitialDir = sPath;& z3 J8 _9 p+ _* T8 K7 y' u8 H
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";9 q$ h3 y: R0 ]* d- O( n
        SaveDialog1-&gt;FileName="fileTo.BIN";
  g$ Q  u# h9 a/ k7 I1 d        if(SaveDialog1-&gt;Execute())9 k8 T9 R$ j3 T2 b2 o% d
        {) `. ~- ^7 l( R
                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());" l0 L  W2 h0 G
                stream=fopen(sPath,"wb");, x# G9 E$ T! ]  p
                for(int i=0;i&lt;BIN_Byte_Len;i++)
6 C8 I3 z! w' M6 \                        fprintf(stream,"%c",BIN_Byte);  //save file* j9 g+ m% c2 x+ ]' B7 y
                fclose(stream);" V: |% P( x& G* D* E$ |
        }, Y" A0 M- |3 f- j2 M
        free(BIN_Byte);( `# p3 z( o9 v# o. G- U
}4 }% K( a. N+ @2 n" K3 i8 L; P/ I
//---------------------------------------------------------------------------
+ {& D2 R6 h: Bvoid __fastcall TForm1::FormDestroy(TObject *Sender)4 \1 T9 z0 J! y8 n
{
$ q' ~- E' t0 k9 j% x# @3 l        if (BIN_Byte!=NULL); v* m. R( D1 S$ t, V; [
             free(BIN_Byte);# f& @. ?8 M5 R( n  x& s7 s; A
}
) O+ O( J' X3 Y. Y9 N//---------------------------------------------------------------------------
, d0 W% o2 a8 i</P>) g/ \; h' v6 S2 ~
<>free(sPath); free(stream);此两句也有问题。</P>6 x9 ~5 z' ^- Q% ]9 e7 e
<>char sPath[MAXPATH];不需要释放;</P>, k8 v( x3 u, a. M
<>fclose(stream)已经起到free(stream)的作用</P>
# O2 j2 \0 Y* R% L4 L
[此贴子已经被作者于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 08:08 , Processed in 5.564953 second(s), 82 queries .

回顶部