QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;7 O7 \5 N" I1 C$ p" b/ o
//---------------------------------------------------------------------------
0 H$ f6 V! E! y" y. }
. W8 X% K) ~, O3 P, G% J8 ~#include <vcl.h>$ A# G5 `: m# V( ~# x0 B
#pragma hdrstop3 C2 j2 B! r4 ?5 f" X- M
! u/ |8 }  w( i5 K7 t- @' K
#include "Unit1.h"/ _7 U9 H4 W* k, J
#include <fstream.h># V! v3 j( G. A6 ]: r9 P
#include <dir.h>
8 t- ?2 h; B7 x  ?) {  b  t#include <sys\stat.h>  U1 D3 x0 u' E6 p1 f* i+ W
#include <malloc.h>
6 @/ ~5 k7 `; |" X' K//---------------------------------------------------------------------------
. Q; |5 ~7 D3 C1 {4 C#pragma package(smart_init)
4 V. s7 M$ P, Z, M#pragma resource "*.dfm"$ b' }6 @8 N4 U& Z6 w+ c, V
TForm1 *Form1;
9 b/ q$ w! l* O; D( D* D) I+ i7 L5 V% U7 f' H        unsigned char *BIN_Byte;
' q7 |& g) d( Q6 r+ w% ]        long BIN_Byte_Len;
2 u- w* o" w7 s' K, c//---------------------------------------------------------------------------
. i% M/ v# ]8 n__fastcall TForm1::TForm1(TComponent* Owner); V: T$ q) L# ^! a9 I& u9 g% ^
        : TForm(Owner)2 s, ~1 Z# r3 K1 `* g
{# b' k) g* I% E
}: J6 n& s8 U% B$ o& O7 a
//---------------------------------------------------------------------------" }4 \- }3 n0 e4 k) C& q
void __fastcall TForm1::Button1Click(TObject *Sender), V$ l+ N% X& e- t. T7 C
{- G$ T4 E( c" Q( n# L! K* Y) K  v* N
        char sPath[MAXPATH];
6 M6 ]7 s/ x8 T, b. t' s! q        struct stat statbuf;
" i! z/ D2 h3 P+ |        FILE *stream;
& c' b5 M& a  N5 t+ M: V" g8 C
% Y! C; |7 w5 s# L) Z        getcwd(sPath,sizeof(sPath));' N2 U, Q6 d3 a; ~4 K; ^& A
        OpenDialog1->InitialDir=sPath;1 @& x7 m1 m$ K: F8 L
        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
% _- T7 |+ K0 K% d0 y' h8 i        OpenDialog1->FileName="fileFrom.BIN";* l1 Y4 k9 E" `9 Q; L* b* a
        if(OpenDialog1->Execute())1 A, n/ [: h9 ^+ I6 }( x6 M' \
        {
: z7 h- y% |- q3 `# n( a                strcpy(sPath,OpenDialog1->FileName.c_str());/ w# W2 c3 L7 N0 v1 h5 Z
                stream=fopen(sPath,"rb");% [: P- m7 E& K$ Q  _) Y% b
                fstat(fileno(stream),&statbuf);* Z- X( _1 R( d4 j& s7 Y, p
                BIN_Byte_Len=statbuf.st_size;
+ \5 p8 f: t$ m1 r                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);% H0 T/ o* S4 z+ I# L
                for(int i=0;i<BIN_Byte_Len;i++)1 B2 |, S& i, H6 X" r' ~
                        fscanf(stream,"%c",&BIN_Byte); //read file9 J1 N9 l& T" F# ]
                fclose(stream);" K$ @8 y; i+ f  p8 }  K  @8 A6 a
        }' |1 w0 A( G: [, y* ^
        free(sPath);- t/ S/ O! g1 R' k2 U$ X
        free(stream);8 ^4 c9 z7 A( R5 ]+ @
}& G$ x! U3 k$ Y( z
//---------------------------------------------------------------------------
0 m# T, y7 j4 B, s6 Gvoid __fastcall TForm1::Button2Click(TObject *Sender)8 U" F. i2 l  k
{( C0 z* o* G; I/ |! X' B
        char sPath[MAXPATH];
2 e/ Q$ {) b, T& |2 {) s! H        FILE *stream;
6 m* A3 Z9 |# x+ C5 Q( m0 Y        getcwd(sPath,sizeof(sPath));//App.Path1 H2 M+ k/ [( W
        strcat(sPath,"\\");1 {2 m( s2 Y( W3 `, L$ n+ h
        SaveDialog1->InitialDir = sPath;
3 h, {9 \# w6 I3 e7 I9 a! f, \        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
# J% m/ I2 q, U        SaveDialog1->FileName="fileTo.BIN";
: |8 ]  E8 w8 X        if(SaveDialog1->Execute())# M3 w% p0 w7 Y  |$ O: M
        {' D* O" c  w; @
                strcpy(sPath , SaveDialog1->FileName.c_str());+ n! K; ~& L4 c/ b" y
                stream=fopen(sPath,"wb");
$ u! c) X# m' M0 x) B8 d9 i5 g                for(int i=0;i<BIN_Byte_Len;i++)
0 |+ R( n# o4 z% n) O5 t                        fprintf(stream,"%c",&BIN_Byte);  //save file
$ G7 C- E- z/ [% o                fclose(stream);
; i% }* s2 V5 }0 h6 d        }
! {% a' _) o3 E5 G7 v# a        free(sPath);
% U: B7 B& U6 `- Q) e4 T8 w/ r        free(stream);" n. R1 @6 [/ s# j( E- _
}+ U' ~' v+ Y! }2 y0 v7 ^+ S
//---------------------------------------------------------------------------
( S4 y$ q' Z8 hvoid __fastcall TForm1::FormDestroy(TObject *Sender), W, y: g4 {) T' m
{( u: o8 U* I" S5 t# P
        free(BIN_Byte);* R2 _! f# [, J! a( u7 _
}! [" ^5 Q; K8 K1 v, o  T; a
//---------------------------------------------------------------------------
+ D$ U  [- F3 T! K$ j. G8 H' ^( Q8 n0 z# g$ u1 r
打開一個檔案,再另存為另一個新檔案4 r4 A  I5 u2 \0 {
結果兩個檔案內容一樣
. O6 B2 L# m& e& a* H, G$ v8 f: ?順序不一樣了$ e: a7 J- [! p6 Y
檔案前面一段內容跑到結尾去了0 d/ L9 B2 T( }0 s* M# Q+ R  C
就像下面的情況0 e6 D9 I* M: x4 @, O: ?
原來檔案內容:ABCDEFG
8 C4 [) V. Z2 V  O新檔案內容:CDEFGAB
+ q5 u, A( ~! p老大救救小弟哦0 K; y8 E5 R0 C/ _( [
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>3 k8 ^5 f+ N9 R2 @3 I
<>alloca:</P>: }( M$ s. l+ b& B7 L! P, \
<>Allocates temporary stack space.</P>
6 y& f5 O4 F8 B4 S- J<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>
( I8 [; v. L3 m) @, ]6 E' p<>malloc:</P>0 V( ^: h1 a5 y2 V& P! u& C  J! 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>1 h" n; D  P* f" i/ G$ c8 m1 `
<>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>
1 y: e) F' y0 X
; w4 A, f. I0 e. m  n8 J9 D- i# G<>以下是改后的代码</P>' Y. f2 |6 t% k: i2 Y# t
<>//---------------------------------------------------------------------------</P>' [8 N% u* D: W* e" d
<>#include &lt;vcl.h&gt;% ]; j7 `9 @" R6 b+ M% W4 _5 M$ U
#pragma hdrstop</P>, r2 C1 ^7 D0 t& N' Q; Z. @4 N. Q) E
<>#include "Unit1.h"; H! [. |$ ?3 t
#include &lt;fstream.h&gt;
" A6 `# t- J. D) ?) {#include &lt;dir.h&gt;
* H' W" V# ]0 e#include &lt;sys\stat.h&gt;
% V2 q) b* p! Q4 `; I. S#include &lt;malloc.h&gt;
3 t$ F7 p% X# R  E1 E5 O. V//---------------------------------------------------------------------------0 n8 d3 V- O6 S
#pragma package(smart_init), k) O$ y, w* g6 B
#pragma resource "*.dfm"
3 q+ F2 z  m; g' q- O! @TForm1 *Form1;
, \; F& s5 Y1 X; Y        unsigned char *BIN_Byte;
4 F/ I. l8 p! a: i        long BIN_Byte_Len;
# j! F% i5 O# |" f! x9 x) `( U//---------------------------------------------------------------------------6 w" n0 `. {" j0 H8 m) A9 ~
__fastcall TForm1::TForm1(TComponent* Owner)
, s: X/ a& Y( V; q, a6 ~        : TForm(Owner)
1 L& l5 A5 N) \" L; l5 Z# v: r{
' `- ]3 Z2 B) m) C3 d: M}
7 J4 k8 ?/ X. \; N+ |) K6 h; c//---------------------------------------------------------------------------) x$ z* M& k# c3 ^% S
void __fastcall TForm1::Button1Click(TObject *Sender)) F5 e1 I+ d* B  |& s- x) X
{0 |  D  [0 j' D7 w( m! |
        char sPath[MAXPATH];
$ z* p! ?# f& [; B        struct stat statbuf;" N* C1 e/ U7 F$ ~5 D7 `* a
        FILE *stream;</P>5 D, z; Z3 g+ ^5 z+ o% E
<>        getcwd(sPath,sizeof(sPath));" z& A9 E, b9 h; H% ~  @
        OpenDialog1-&gt;InitialDir=sPath;) X( @5 P: V6 L! p
        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";9 o" U- a2 J) {1 q
        OpenDialog1-&gt;FileName="fileFrom.BIN";2 u1 g5 ]8 [; I& O/ P
        if(OpenDialog1-&gt;Execute())
+ w) x- {2 B  {2 `, `1 ]# e        {
8 y* E, ?1 E$ i5 k. J                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());
& X8 \8 m" P4 a+ D, Z2 a3 X                stream=fopen(sPath,"rb");
4 _. I, `8 {9 D                fstat(fileno(stream),&amp;statbuf);% Y: K3 a2 l+ a$ {
                BIN_Byte_Len=statbuf.st_size;( v9 b% n, O. s1 Z2 {
                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
" D- n3 o2 a- B  e                for(int i=0;i&lt;BIN_Byte_Len;i++)
7 U$ s( L4 Y0 r$ l+ ^$ Y/ V                        fscanf(stream,"%c",&amp;BIN_Byte); //read file" [3 E2 T; X: R
                fclose(stream);; _* `4 Y; y1 \! V0 {7 }
        }6 C4 U& S$ ^& M/ I! b0 z5 c: {
}9 S+ z2 ?0 `% [, a" ]( U( S
//---------------------------------------------------------------------------; {. i! k; ~& M
void __fastcall TForm1::Button2Click(TObject *Sender)+ \( w  a1 b5 U- p$ K) P7 S- r
{  P- ~2 f5 Z' [7 k3 V2 T
        char sPath[MAXPATH];! e7 w' u9 M8 g0 _8 M0 `8 Q5 ?
        FILE *stream;/ }! w2 x& g- Y5 K$ F. h
        getcwd(sPath,sizeof(sPath));//App.Path; @% H7 P; q: x7 d
        strcat(sPath,"\\");2 }2 _+ N8 ?/ \3 t- Z% X
        SaveDialog1-&gt;InitialDir = sPath;
3 n4 d+ Y/ q/ M# Q' ^+ {        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
- M; E4 ]' f) C5 [# r        SaveDialog1-&gt;FileName="fileTo.BIN";/ a- Z# E2 w- E! \: a  b9 S9 U
        if(SaveDialog1-&gt;Execute())
0 |# M7 J8 H2 B# k7 K        {7 P+ Y9 f/ C! z8 ?1 v3 t
                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());
0 X& O; w& W( [0 x$ z# b" J# j                stream=fopen(sPath,"wb");
3 @# r  n6 I# f+ y( W                for(int i=0;i&lt;BIN_Byte_Len;i++)
* c3 C# n% n( C  Y8 [; D, H& v* \6 x                        fprintf(stream,"%c",BIN_Byte);  //save file
% Z+ q4 x; X# Y4 N( B                fclose(stream);9 N* W. {) j9 D* N
        }1 |. x0 M  y8 d6 b( I5 T8 E
        free(BIN_Byte);
4 r4 [4 m4 ]1 ]0 T}- q$ L6 ^2 @4 D  a3 ]' }* P# y
//---------------------------------------------------------------------------
& N: B0 }6 W: X+ g# \! h6 tvoid __fastcall TForm1::FormDestroy(TObject *Sender)
& \- V# F) p) g  s) }{4 u5 m6 n" {0 E! Z: u. n
        if (BIN_Byte!=NULL)
8 F+ C7 q1 a' K' q& _5 D4 g  U* Y             free(BIN_Byte);
' o- T& }1 \( f! j}2 a, I1 p2 ?% J# L# k
//---------------------------------------------------------------------------
0 D. N7 s0 [) |) U5 e! W. b$ A</P>
$ ?6 P3 |0 b/ B% j  L' a/ n) Q<>free(sPath); free(stream);此两句也有问题。</P>. D$ n# e  e6 t8 \
<>char sPath[MAXPATH];不需要释放;</P>
2 `0 X! q5 N4 }1 L) b<>fclose(stream)已经起到free(stream)的作用</P>; V6 S4 Z+ V0 N- x+ I7 H9 H9 E7 V
[此贴子已经被作者于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-6-12 18:29 , Processed in 0.474592 second(s), 83 queries .

回顶部