QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;5 g0 M0 w; u% k/ v6 F3 S! h
//---------------------------------------------------------------------------
7 h2 H6 t& S9 y% P& ]; W* B
  P1 n* z  @& s* E4 V2 h& {2 k7 N#include <vcl.h>4 G' w  n0 r0 h: g* o  Z0 L
#pragma hdrstop
9 F& f/ |7 D) I/ W* k: I. G, |1 z: z+ z5 w6 l; Z5 r
#include "Unit1.h"
5 y- n0 L; r7 e! \/ u#include <fstream.h>
( [- I4 j8 b  [#include <dir.h>& Y' @2 W4 C/ P! o
#include <sys\stat.h>( J' q, ~. A) Q( k6 S9 i$ T& z! L( J
#include <malloc.h>0 p2 l7 R5 @: [& h, E
//---------------------------------------------------------------------------* r# m7 H" W5 y. [2 ~- X
#pragma package(smart_init)
5 f. |# u) Z" ?#pragma resource "*.dfm"
, p* K! C9 c0 R" }( j2 VTForm1 *Form1;! J; H& h+ I' p; _3 D: h
        unsigned char *BIN_Byte;
3 B' O$ v, E9 C1 n5 y. l        long BIN_Byte_Len;' T: E" V6 q: r. f/ u' O- {$ A
//---------------------------------------------------------------------------
* k0 g% z; y: K% I6 Z9 x8 a7 }__fastcall TForm1::TForm1(TComponent* Owner)
2 ~3 l- }& M6 w4 ?# F. b" C        : TForm(Owner)3 S+ X+ X; I# T& A0 U  w
{1 O! }! j& ?: x0 k; B
}3 ^. i% p  f) Q* q4 c) p
//---------------------------------------------------------------------------5 c, n7 f9 [' I% x+ e" W& D  S! {
void __fastcall TForm1::Button1Click(TObject *Sender). ]; j; [( Z  e* s# @
{+ v1 [" [/ Z) P8 Z
        char sPath[MAXPATH];
- E: f  O% T1 q% N! r        struct stat statbuf;
9 Y" C. o( m9 }0 U  J        FILE *stream;) V+ @- c# B9 Q$ X& Q4 y. h3 l
+ y. ~8 r% d2 T6 }7 G$ u+ R( s2 V) a
        getcwd(sPath,sizeof(sPath));5 q) H2 P9 ]- F, W1 X
        OpenDialog1->InitialDir=sPath;3 d# J$ I/ {! Q& s9 ?
        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";- }* X- o7 k- p, L4 z& N
        OpenDialog1->FileName="fileFrom.BIN";
  `3 d* v- x! b' D$ {( f; ^, o        if(OpenDialog1->Execute())  }1 U$ C( y, N6 X+ q
        {
4 N" A' J  M3 ]/ E7 v                strcpy(sPath,OpenDialog1->FileName.c_str());
) V$ ^- b( Y# ?, U2 Y  p                stream=fopen(sPath,"rb");/ T: y( {3 P; U" t
                fstat(fileno(stream),&statbuf);
3 P) b1 D$ M% j$ }4 b" i                BIN_Byte_Len=statbuf.st_size;
/ v/ x: ~% k7 c2 Z5 e, n( R) @) x                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);
& v$ x/ w1 j9 Q4 x/ C4 h                for(int i=0;i<BIN_Byte_Len;i++)
8 O& p# D. h7 ]" b) R/ a                        fscanf(stream,"%c",&BIN_Byte); //read file4 U5 k& t  F" Z: Q
                fclose(stream);
& g' m9 s0 w$ e        }
$ W( T* M# m3 V5 g. a2 r5 G# a        free(sPath);- ?$ ^/ a3 |, c8 ^# O. o
        free(stream);( d6 I' M3 q+ ]& n, r2 N9 h' X
}7 X' t: E6 [5 f; a
//---------------------------------------------------------------------------
& c7 G2 S4 e# {- @& m2 e& yvoid __fastcall TForm1::Button2Click(TObject *Sender)
* l+ i1 {4 u5 x( m' v6 r{
- q2 @( M) H4 y  g5 l8 C) R# R        char sPath[MAXPATH];4 M+ c6 |5 P* \/ `# m* P5 |: x) |
        FILE *stream;
& w( d% w2 X, R        getcwd(sPath,sizeof(sPath));//App.Path
. V( ^7 Z$ B, B' V- b+ M! p        strcat(sPath,"\\");2 ]( F% E" F; i- D: p. ~
        SaveDialog1->InitialDir = sPath;( R6 K' S' Y: F+ ?
        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";! [1 U3 ~/ X' c! q3 F
        SaveDialog1->FileName="fileTo.BIN";5 s! G0 m) E% s! V& S) e  h+ V
        if(SaveDialog1->Execute())7 h' x! D1 I* i  g% ]1 ~; D
        {% L0 ]+ Y9 Y( b. j2 B
                strcpy(sPath , SaveDialog1->FileName.c_str());
9 h; _" a* E% X                stream=fopen(sPath,"wb");
" {' k6 X- O# C# E" n) W                for(int i=0;i<BIN_Byte_Len;i++)
/ R; f6 k, n+ B# \$ u& A                        fprintf(stream,"%c",&BIN_Byte);  //save file
; L, ~6 R8 J. Y% g                fclose(stream);
+ L& T* f% v/ O  G$ m! N, v        }
0 a, s# i3 E6 H& m3 }7 i7 j" S        free(sPath);
& _6 t- ]* I$ w, N3 l        free(stream);
2 b0 ]3 o3 i  T9 D; ^& E}8 q: U' _9 M4 C( \! R# I9 c9 z% Z
//---------------------------------------------------------------------------; r: s) E$ h6 v4 f- L1 ^+ K
void __fastcall TForm1::FormDestroy(TObject *Sender)
' N8 C4 {9 D0 q& x  x4 O{
' \5 _" R' H+ d7 K        free(BIN_Byte);9 p# {, z0 H% V
}
) t( }* @0 h0 A. N( X6 m7 e  ^//---------------------------------------------------------------------------, q* D/ w# V& _. x, u" y
0 Z4 `( ], v8 o' N
打開一個檔案,再另存為另一個新檔案
- L9 l- H/ q6 n' t( L0 P結果兩個檔案內容一樣7 v7 V" y+ {/ e* @% f0 K. t
順序不一樣了
% K$ K, D( \( L5 O2 Z6 `4 c7 A0 h2 b檔案前面一段內容跑到結尾去了0 e7 k8 d0 K* }; F; X. r0 r1 p4 ^
就像下面的情況
4 g' D# ?& g9 G) N5 d# b原來檔案內容:ABCDEFG6 ~3 Y3 f& q& |' W6 d
新檔案內容:CDEFGAB
2 q# m9 D2 {2 w2 j  {老大救救小弟哦" Z% i9 b5 J: O& p% `  w
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 b' L9 z
<>alloca:</P># a5 R0 M+ T6 g. ]7 o
<>Allocates temporary stack space.</P>5 ]7 c, K% k0 Q3 `7 D7 D
<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>
4 B+ F3 h9 T- s* \& ?<>malloc:</P>
2 B; b6 X, D. D( b! 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>
4 {; K  k4 ]6 ]; `5 p4 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>0 ~$ t+ S5 a& X, N
" l! ~# O' M! v- i! w
<>以下是改后的代码</P>
+ ^0 t: v/ C$ [5 w<>//---------------------------------------------------------------------------</P>
/ r. V! |( C  b: q1 e9 P) m8 J<>#include &lt;vcl.h&gt;% ]$ F. U" A9 @0 {; q
#pragma hdrstop</P>8 V" k% Z0 n! q/ \8 G9 v$ y3 L' x
<>#include "Unit1.h"% j7 P. E  e3 f  o5 n
#include &lt;fstream.h&gt;  E; Y9 U/ \! H. Z" c
#include &lt;dir.h&gt;
: Q2 O* X. M" R6 y2 d#include &lt;sys\stat.h&gt;
& b9 K. |% j  m2 w3 ]: q- Y#include &lt;malloc.h&gt;
5 c7 [3 N. H4 r( J  x1 f: X6 [6 k//---------------------------------------------------------------------------! E% z- m: t" ]* p! v
#pragma package(smart_init): s! W+ t' B7 M/ {/ D
#pragma resource "*.dfm"% Y4 [% W/ J; n  B
TForm1 *Form1;
/ V, E+ W: x; v        unsigned char *BIN_Byte;% O" P! g; D; z) ~# J( t2 T
        long BIN_Byte_Len;
7 j' f  b# H. X& y% e//---------------------------------------------------------------------------
0 }+ |! M6 d. Q" b- Y: h4 d( b__fastcall TForm1::TForm1(TComponent* Owner)
4 W4 N/ y2 ^8 a3 x) @% k        : TForm(Owner): k7 \7 _3 `8 @* l, ?
{
, S# i9 s6 r( f& w5 V}5 I7 Q/ _' x4 S: h
//---------------------------------------------------------------------------
9 j3 x) J1 {2 T) [. N7 Avoid __fastcall TForm1::Button1Click(TObject *Sender)
; l$ v% n+ p2 L7 _; R6 n{6 i7 E6 u6 m9 M
        char sPath[MAXPATH];
  H: G4 Y7 J  Z' H! J/ W9 z        struct stat statbuf;4 y' W& y: x1 ~$ h/ A4 o; }
        FILE *stream;</P>  v2 b) d8 @7 X1 O. ?
<>        getcwd(sPath,sizeof(sPath));
6 l& K! t, c- H; m6 f        OpenDialog1-&gt;InitialDir=sPath;
, {7 w/ `8 F, {/ A8 _        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
; I4 v: H0 D2 I* N        OpenDialog1-&gt;FileName="fileFrom.BIN";
: V$ S6 Y' G( U( ]' L* h$ O2 |2 Y        if(OpenDialog1-&gt;Execute())
* z3 d4 A4 n, k8 y  _# o        {
  t) }) l* ^8 c  k$ w0 A                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());
5 l9 ^8 \8 g+ C5 k                stream=fopen(sPath,"rb");* J, `3 _' Y, H/ L- @+ E
                fstat(fileno(stream),&amp;statbuf);5 }1 I. O% ~6 |8 Y) L
                BIN_Byte_Len=statbuf.st_size;: e8 J- ?) H! G4 j
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);/ F( g/ n9 g1 e9 ^" g  q9 s
                for(int i=0;i&lt;BIN_Byte_Len;i++)
3 J; p5 I  M1 ]4 P5 f( {+ D                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
& Y6 K3 n! s- O7 t% q( J) d& s. |                fclose(stream);
9 a3 f7 w6 G4 |1 q! g4 _        }
& s- `) Y) C+ c9 C}8 l( e) n4 c7 @0 M3 d& j
//---------------------------------------------------------------------------2 I* M! u3 B. C. V
void __fastcall TForm1::Button2Click(TObject *Sender)
+ i& i$ k7 m& h( a- ]! v) O{- i  C3 k9 \' f1 ?! J
        char sPath[MAXPATH];
. m7 B" A5 T6 {; p        FILE *stream;7 j9 @  q! B5 l3 Z
        getcwd(sPath,sizeof(sPath));//App.Path; S5 T2 L! j! B+ x
        strcat(sPath,"\\");
2 G% g" E) R! c9 y. s        SaveDialog1-&gt;InitialDir = sPath;; X2 b3 Z6 g8 b! f
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
# U  ^7 U0 T$ ~1 k  i* m' y        SaveDialog1-&gt;FileName="fileTo.BIN";" B( K% m- y1 o+ i- K% r
        if(SaveDialog1-&gt;Execute())
8 j; C+ S9 @" p' K6 s6 G5 V        {
" a3 q% M; z/ c& j; T' \                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());% y6 B2 Z* {5 w! ~6 \
                stream=fopen(sPath,"wb");3 k9 z. }! H( h$ V
                for(int i=0;i&lt;BIN_Byte_Len;i++)
0 i/ r5 [1 Y5 E. I4 z! y$ u" U" f                        fprintf(stream,"%c",BIN_Byte);  //save file
3 ~. z# Z' C- X                fclose(stream);. i" i) ]+ ^3 k
        }
9 n; w1 [) p+ e+ b        free(BIN_Byte);4 y& Q: v9 L3 ]/ M
}
4 T5 q$ v1 K3 \4 H% _* |//---------------------------------------------------------------------------
/ C; B7 k5 o! |, Z& Avoid __fastcall TForm1::FormDestroy(TObject *Sender), }/ J0 a% o/ h4 h( M  Y# _5 c4 _
{
2 s- I' y7 l& F' ]8 T: [        if (BIN_Byte!=NULL)
+ |  o1 p. E( U0 c& q( n0 N  ^             free(BIN_Byte);0 E; k: H/ Y; j( x% Q
}
; r1 P0 D5 n& F8 \8 s//---------------------------------------------------------------------------' z1 p2 a6 a9 ^0 l
</P>
! ^3 j- l5 v" z" x1 {4 p2 C<>free(sPath); free(stream);此两句也有问题。</P>+ g0 i% O* G* C* S: y
<>char sPath[MAXPATH];不需要释放;</P>
# j5 i" V2 O4 F0 P<>fclose(stream)已经起到free(stream)的作用</P>/ I; \. [" t4 k! J' n0 \3 r7 ]
[此贴子已经被作者于2004-6-15 15:16:40编辑过]
回复

使用道具 举报

kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

fastpost qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-11-1 15:06 , Processed in 0.317244 second(s), 83 queries .

回顶部