QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |正序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;7 |' Q9 t$ n8 z9 U. Q9 \, B$ n
//---------------------------------------------------------------------------# |0 p8 ?1 j- F5 a0 D
- |2 J( N0 I% V3 z  M' X( w+ _
#include <vcl.h>
1 N$ S2 S2 P" v6 g8 `& ?0 y! Z#pragma hdrstop
+ Z5 L+ G1 A: t  `. ~0 m0 E
' I, p# K( J. Z/ ~6 a0 g#include "Unit1.h", ]0 t, K$ {: g5 q5 ^9 t% ~6 }
#include <fstream.h>
9 I( j4 |) J; f9 V#include <dir.h>
7 o7 s5 i- n# t9 }! a3 o#include <sys\stat.h>
+ L& k9 r) b; ]5 P4 X. a; j1 B% S#include <malloc.h>4 N) k. Z9 [# h/ m: w
//---------------------------------------------------------------------------! Q- C9 }# M+ c" R+ {# U$ D* r
#pragma package(smart_init)
, D: n9 L' o) L- }" g  T  V; D#pragma resource "*.dfm"& D5 n" k1 Q0 k9 G: P, E5 B
TForm1 *Form1;* M* X# _8 U! O. |
        unsigned char *BIN_Byte;2 H( X8 E( A8 U6 W$ e
        long BIN_Byte_Len;2 Z. F# C% |/ p8 {9 X
//---------------------------------------------------------------------------
2 q) X2 v: I* `% R% I4 A  V. H3 u9 k__fastcall TForm1::TForm1(TComponent* Owner)
$ K0 S1 E* T4 ^  `% H  _7 O        : TForm(Owner)- ]7 r$ _5 n9 l
{0 }9 l" `! d. E+ T
}
+ i. a. |$ |7 i- }//---------------------------------------------------------------------------, |* z. K8 f8 Q" h" L: W
void __fastcall TForm1::Button1Click(TObject *Sender)8 Z; N6 `- M2 v9 Z# ?3 C
{
5 I4 Y5 T* v. j& @3 d7 E        char sPath[MAXPATH];
. d  n/ ^) @5 U4 E3 y        struct stat statbuf;
' j2 P# d; G% M, m; r        FILE *stream;  h9 u3 n: l5 N+ _; Q6 {6 l- v, C

- E+ l( d7 p4 E        getcwd(sPath,sizeof(sPath));
  l! I: V, C. X* W: r        OpenDialog1->InitialDir=sPath;
( \4 K# X8 {7 e        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";4 P$ C% m# p% y) ?; U4 I$ o
        OpenDialog1->FileName="fileFrom.BIN";
: ]3 R& Y9 B. _        if(OpenDialog1->Execute())
& E( ]) \: L& u' \& F: F( m: A        {( F$ p  X7 T" b- b
                strcpy(sPath,OpenDialog1->FileName.c_str());
% c# o# j0 T8 i; Q$ Q                stream=fopen(sPath,"rb");4 [8 g- |- ^: u8 D9 P
                fstat(fileno(stream),&statbuf);
' S4 C: C( I1 }                BIN_Byte_Len=statbuf.st_size;
: K& ^: N2 e# W2 }  `' L1 k                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);
* `1 P3 _* n; k1 p6 y! j# A: _                for(int i=0;i<BIN_Byte_Len;i++)
6 D+ Z+ }. p8 p  q) f& s$ S                        fscanf(stream,"%c",&BIN_Byte); //read file
0 A0 U$ {; l/ C3 y  R                fclose(stream);1 v5 X! q( J; i  S# i! n  E
        }
' P1 s+ R/ {4 X8 V, C8 I, k/ C        free(sPath);
; m3 V4 G" c+ D! |7 f+ o/ C$ H7 A" U        free(stream);9 o# Z; x! a+ }% Y. O
}
6 ^. x8 z& V- V8 _# H//---------------------------------------------------------------------------
' D& z# \) t5 ivoid __fastcall TForm1::Button2Click(TObject *Sender): \9 ^8 K; |+ B
{  S3 @. E$ Z+ u  b
        char sPath[MAXPATH];9 v% d9 `2 J* r) I) Q( I+ x& E# z
        FILE *stream;
, l: Y. W9 k6 O# p6 n4 F/ p% A9 S        getcwd(sPath,sizeof(sPath));//App.Path
. C# T9 E2 g; e9 n( v8 p4 c        strcat(sPath,"\\");2 D: G  `" o( }+ I9 d$ U; Q# U, Z8 o
        SaveDialog1->InitialDir = sPath;
0 i: ^* M) B: [0 T7 `        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";+ X+ }% n& d8 X: J/ f1 J3 i7 b! f
        SaveDialog1->FileName="fileTo.BIN";4 \) t" W' w5 c" z. P: O) l( x
        if(SaveDialog1->Execute())0 y0 E1 W9 l5 }3 {; U& X% Y
        {
: p$ l% k9 c$ u- @+ h. f& y+ R                strcpy(sPath , SaveDialog1->FileName.c_str());: G: ]2 x- U4 ]: Q- B# T
                stream=fopen(sPath,"wb");3 s- U( h2 v8 S( J
                for(int i=0;i<BIN_Byte_Len;i++)- H2 p9 R) o% B1 |# O
                        fprintf(stream,"%c",&BIN_Byte);  //save file" o& b5 e/ |4 L6 r- Q" n
                fclose(stream);2 U+ f# p4 S: [% u
        }; {* e% y4 e! U
        free(sPath);
, L8 q  O" V3 f+ j" \1 a( C        free(stream);; n" i: U& R2 G* o, z4 h
}
" ^2 n- m  T2 Y( I0 T+ ^9 E//---------------------------------------------------------------------------( J; i( C9 Y2 s- b" Y7 A
void __fastcall TForm1::FormDestroy(TObject *Sender)- Y! U' J0 R4 P1 c. g4 v& K
{2 Y: m2 m( V4 z" |$ H  u+ k1 w4 `! m
        free(BIN_Byte);) ^5 y* {  F' E* K+ w# B% i# U: K
}5 K! `6 n8 g3 p3 c9 E. K$ O
//---------------------------------------------------------------------------+ z; _7 F5 R1 ^! H3 q

+ H* K4 H- a6 e/ Q打開一個檔案,再另存為另一個新檔案- B9 r# e; A/ ]; j/ r9 `
結果兩個檔案內容一樣
0 B. u( L7 n9 f# x. W順序不一樣了( X7 R; s( v* a' N4 t* z
檔案前面一段內容跑到結尾去了
. _) S7 C1 r2 W2 a就像下面的情況
9 e4 |2 y" S; y" J- j6 M原來檔案內容:ABCDEFG
# U9 [+ g6 Z2 X2 o& M新檔案內容:CDEFGAB
$ h* e1 a& A0 B1 J# D老大救救小弟哦
7 I+ |5 u1 f. o; C1 V& `) o- I
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
本人方年22,学识渊博,英俊潇洒,七岁学文,九岁习武,每外出行走,常引美女回头,帅哥跳楼!
kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

high_hill        

0

主题

0

听众

19

积分

升级  14.74%

该用户从未签到

新人进步奖

<>不知道你找出的问题在那儿,我判断是alloca和malloc的误用。c++中对指针(内存)的操作总是容易出错,这些系统函数的使用,最好先仔细看看help。</P>
3 v1 l0 I% ]/ V7 `<>alloca:</P>$ ]' d; B( I1 N' \4 j* A! k& S! R
<>Allocates temporary stack space.</P>
" K- [" J0 p1 n3 a' [' o<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>
, H) ~, V  f% R2 F" j7 f- n# |<>malloc:</P>+ X( z; K- M) c# V5 u& {8 k
<>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>: A# y) N6 a# ^9 L( W2 @
<>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! z( o  d  v: B2 J2 `- k8 [/ f: b. I
<>以下是改后的代码</P>: |* G4 h6 D' E% C! Q
<>//---------------------------------------------------------------------------</P>% U: F1 ^1 o* ^9 W% e
<>#include &lt;vcl.h&gt;$ P) i+ W6 w/ B8 D
#pragma hdrstop</P>) \! V" F5 k2 n7 x; f  D. Z; V! n
<>#include "Unit1.h"4 ?  G+ r# t% W1 ^; X  B
#include &lt;fstream.h&gt;
0 d/ E, r' E/ N#include &lt;dir.h&gt;
% C$ D. Y6 B8 x; x2 a#include &lt;sys\stat.h&gt;
" T* F9 ~$ o+ T1 s2 v$ Z#include &lt;malloc.h&gt;( T: y+ n  b( R/ s0 l3 X
//---------------------------------------------------------------------------$ m$ M3 n) v8 A( j" p* D5 y) o2 I
#pragma package(smart_init)3 _& K: b' E9 [1 H
#pragma resource "*.dfm"
- h4 j! o  v- _( N( u$ ?+ cTForm1 *Form1;
$ O9 i2 L5 @) f- ]        unsigned char *BIN_Byte;4 c! o. Z0 X# U& o- Y
        long BIN_Byte_Len;
6 S, B- {. N. z$ Y; q//---------------------------------------------------------------------------
: q% l+ X5 Y6 T+ \__fastcall TForm1::TForm1(TComponent* Owner)" F$ _: C& m" I0 V! P* H
        : TForm(Owner)% k4 I$ r/ a- e5 O8 M$ |+ @
{' q) N% G" f# f3 z8 E- x; f* a
}$ [" b. E/ Z$ y; g/ N, s- B: H+ x
//---------------------------------------------------------------------------
  e  u# b0 i# [$ fvoid __fastcall TForm1::Button1Click(TObject *Sender)4 e9 f2 O8 v* m  I8 b, P
{
; n: H9 ~" D0 `5 L5 a' r        char sPath[MAXPATH];
* D* S* u, K: \: g. X8 P        struct stat statbuf;
5 f" x0 N! |( D! b+ q" I* H        FILE *stream;</P>
$ t: ?6 v0 c6 e3 _, U<>        getcwd(sPath,sizeof(sPath));
2 s! U& c2 H) c+ W        OpenDialog1-&gt;InitialDir=sPath;  E, e+ {) t1 w
        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
1 C! b+ \) x9 ~, ^! ^  q, i        OpenDialog1-&gt;FileName="fileFrom.BIN";1 s  H% [% p# l0 T% p
        if(OpenDialog1-&gt;Execute())
2 Z# B% T+ q/ F+ U& o        {1 u' e/ v  `- I
                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());; y3 t" R) V: ^  D/ }5 O+ b
                stream=fopen(sPath,"rb");  f8 k( |8 h8 G* t! O: s" P
                fstat(fileno(stream),&amp;statbuf);
' }2 l" {$ ]6 F5 w. o  o& |% L                BIN_Byte_Len=statbuf.st_size;
. I' f" [+ m# v4 t                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);% h# y, {. `7 p
                for(int i=0;i&lt;BIN_Byte_Len;i++)1 y8 h) d; _$ c# x
                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
9 u  o. c8 q. P# F1 x3 v                fclose(stream);9 s( J: z4 r7 P: e3 H7 |
        }; s* S1 \6 U: W6 o' x, h
}
' [5 [; K- v9 W0 F4 ]0 Z, P2 S" ?- i//---------------------------------------------------------------------------
6 x% x" u9 t' F+ I: ^void __fastcall TForm1::Button2Click(TObject *Sender)# x: X4 Y) e. T8 K6 `- ~  Q$ T
{$ Y$ p" A3 h$ W
        char sPath[MAXPATH];
6 D( Z; U: D; Y        FILE *stream;" N6 N8 ^! s- Q& t; p; |
        getcwd(sPath,sizeof(sPath));//App.Path/ J) ^; W  l: _1 m
        strcat(sPath,"\\");
# S5 `/ J$ I5 A6 X        SaveDialog1-&gt;InitialDir = sPath;; v% t4 O( {% Q/ [
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";$ {( m% X4 C8 [! o! l# k
        SaveDialog1-&gt;FileName="fileTo.BIN";7 {( \! q5 D5 S) d
        if(SaveDialog1-&gt;Execute())) |6 v- q3 b( Y
        {, r! C5 y* n- E- Z) Y* E
                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());; h" C! K# V! N
                stream=fopen(sPath,"wb");! E) L  I% q* }* j
                for(int i=0;i&lt;BIN_Byte_Len;i++)8 J! ]7 B' r; V4 ^6 y. X1 W3 f( {
                        fprintf(stream,"%c",BIN_Byte);  //save file
8 C. k  {5 s# |) X# m, J/ U                fclose(stream);4 Z% N8 R# B5 \5 k; D
        }- D3 X" d+ C, S2 W+ L- A
        free(BIN_Byte);
& l0 o0 M' U- N& d}
7 ?* O0 i; ]  U; s* p# `$ I* {//---------------------------------------------------------------------------
$ O; A; q& [. C5 S0 x. xvoid __fastcall TForm1::FormDestroy(TObject *Sender)5 n" G2 Z3 r; r& s: c
{/ h9 D$ h- l( @/ k
        if (BIN_Byte!=NULL)
/ X9 o/ O6 J4 _+ ?5 s0 [- E& |0 @+ Z             free(BIN_Byte);
2 U( X4 P+ s; x+ u4 Y}
& `. }% U$ i3 R) ]* D//---------------------------------------------------------------------------
4 ~, t& ?. g( \3 b0 Q</P>5 p- |) b: ?, |
<>free(sPath); free(stream);此两句也有问题。</P>
! L% f8 ]  K1 Q4 Y: u0 B2 @# u<>char sPath[MAXPATH];不需要释放;</P>
1 F% F* a( P( ]: l0 ~  \. t<>fclose(stream)已经起到free(stream)的作用</P>
8 U& Z+ Z1 U2 X" }# ]* P! v( A! @
[此贴子已经被作者于2004-6-15 15:16:40编辑过]
回复

使用道具 举报

kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

kenneth        

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

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-28 23:23 , Processed in 1.801662 second(s), 81 queries .

回顶部