QQ登录

只需要一步,快速开始

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

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

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

10

主题

1

听众

98

积分

升级  97.89%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-9 11:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
新建一個專案,在窗口Form1上加兩個按鈕,一個OpenDialog1,一個SaveDialog1;
4 i: X( o& D8 |0 _" }+ |//---------------------------------------------------------------------------0 |, @( X5 e4 e; _" V0 R( A
7 k* I, C( E# z
#include <vcl.h>% Q4 J0 {* J: L+ c, u2 b
#pragma hdrstop
4 G- {* L. q: M: @4 T+ I" U
: C8 J( A& ]! K3 [! U% s- p#include "Unit1.h"
# [6 B+ [; H( K8 z0 m% g" F#include <fstream.h>: W: j2 O/ \" X) k2 @: y
#include <dir.h>
1 T7 l/ u  P7 c8 B' A: K#include <sys\stat.h>0 y- {9 G, [1 H3 \
#include <malloc.h>+ z% Z* E3 v- A. R6 w  j& R  T6 q4 k
//---------------------------------------------------------------------------- q3 n7 T1 \0 t6 [6 L
#pragma package(smart_init)" i* y  K4 B$ Z/ S" z0 \7 c
#pragma resource "*.dfm"* J; t* X- E' j  c/ ~3 y0 {
TForm1 *Form1;( P; [9 ]3 N9 q( P! q0 L0 y' n
        unsigned char *BIN_Byte;
) S$ _. P8 u/ q. x8 P        long BIN_Byte_Len;# X9 V. W: h0 k
//---------------------------------------------------------------------------2 `' d/ Q! G+ A' F
__fastcall TForm1::TForm1(TComponent* Owner)
7 [& [0 N' W4 p! o        : TForm(Owner)
) `! {: i; x; l9 m9 e* Y{4 r6 E6 S. W' T/ J( ~7 z' c( N
}
7 i, \# H1 J  A2 `5 W. n# f: ?/ ?% H//---------------------------------------------------------------------------5 p" H4 l: {+ H' g( [, @9 @6 J
void __fastcall TForm1::Button1Click(TObject *Sender)- l  ~+ M8 `5 H( A) @
{  l# G& h  o1 s" h/ c4 w
        char sPath[MAXPATH];
5 P9 @: V0 |9 i1 J, c/ h% V        struct stat statbuf;
% y# s# Z# V" [; R        FILE *stream;, w8 n/ L: x8 o0 |6 L6 f4 p+ R

" v. Y6 A5 M8 p) |" z        getcwd(sPath,sizeof(sPath));! u1 T( S* V- G/ E  F: g
        OpenDialog1->InitialDir=sPath;
0 t) n* W+ f9 ]1 g4 R        OpenDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
) I) M8 t0 l6 |2 i6 I        OpenDialog1->FileName="fileFrom.BIN";4 c0 f5 S8 g, ]
        if(OpenDialog1->Execute())9 ~9 j: v9 L* U7 F
        {
4 h3 x: a/ e# c; E+ l2 ~                strcpy(sPath,OpenDialog1->FileName.c_str());( g! f! d7 `) g' Q: [" P4 ]
                stream=fopen(sPath,"rb");
- P% ^+ r6 o2 E# x' y                fstat(fileno(stream),&statbuf);
& n/ A* l" _# D, W8 p' \                BIN_Byte_Len=statbuf.st_size;
, a# T3 R/ g; \$ _5 v9 p                BIN_Byte=(unsigned char *)alloca(BIN_Byte_Len);' J- L/ c5 C6 V# V  q! Z2 h% l
                for(int i=0;i<BIN_Byte_Len;i++)
0 Y9 `$ X3 Z* r6 u* W                        fscanf(stream,"%c",&BIN_Byte); //read file" _& D9 a$ g9 M  }5 b6 l+ O
                fclose(stream);+ ]+ ], W' W. B9 e: H
        }
6 x" a: [5 s% ^# Q3 B2 W        free(sPath);; P8 T: l/ X$ c! o$ K
        free(stream);
( ?" t/ a9 W9 @, p4 ~& b}
! q; {* N! c: [$ Z//---------------------------------------------------------------------------
7 N% h9 V, z# f& pvoid __fastcall TForm1::Button2Click(TObject *Sender)
9 Z. S7 r  n5 x* }{' j. W; G" N' \0 D# y
        char sPath[MAXPATH];/ {$ N8 ]3 m! \& V- [
        FILE *stream;
0 V+ X- s/ w) r, n        getcwd(sPath,sizeof(sPath));//App.Path
( t# `" |9 x) T( J* c0 Y# }* @* j' i        strcat(sPath,"\\");9 J& x) T0 {1 S
        SaveDialog1->InitialDir = sPath;
. K9 v, ^$ O/ ]2 `8 B: E* \9 u        SaveDialog1->Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";* h  ^7 S6 i3 K) z9 T$ |/ q) z
        SaveDialog1->FileName="fileTo.BIN";+ z3 Q# N' H1 Q, ?
        if(SaveDialog1->Execute())
2 @( y7 @  A3 g  |8 A% N1 C        {( R# g9 [; `* h4 T3 O7 M4 ~
                strcpy(sPath , SaveDialog1->FileName.c_str());
4 j5 S* \8 S7 H                stream=fopen(sPath,"wb");# p. E/ ^1 ~0 ?
                for(int i=0;i<BIN_Byte_Len;i++)+ Q# o+ O5 {/ _; s+ E
                        fprintf(stream,"%c",&BIN_Byte);  //save file* f" s- j3 I+ Y* I3 Y9 l( T; K
                fclose(stream);
; A, {( B% x9 }# m. h6 S& r        }6 ~0 Y2 z' Q1 h
        free(sPath);  c  r$ M: p1 J
        free(stream);6 H) }* G4 h& O
}: U7 r5 }8 R4 B3 Z+ C; Y, c
//---------------------------------------------------------------------------3 ~* L# l4 C' q$ |9 ?5 m
void __fastcall TForm1::FormDestroy(TObject *Sender)4 R5 r! y: Y8 I, R; |- {
{
4 h  l- h4 T; L0 z& X' s; r4 _4 N        free(BIN_Byte);8 T, i6 [$ C0 Q+ N
}
! `4 {/ `# z$ Q* h- m8 i//---------------------------------------------------------------------------% j# E& U' ]" \% D+ }. ^
' q/ a  d% n! w( n
打開一個檔案,再另存為另一個新檔案
& [: B! j* T# v, Q. u( _# L7 F結果兩個檔案內容一樣
8 l* }  Q# p9 y順序不一樣了* t/ i% j: x! j) F; z9 p
檔案前面一段內容跑到結尾去了" z4 ?/ U3 c: l: b6 t7 l( ^+ a, w
就像下面的情況
& P8 M' r# _! X" w7 e7 U- T原來檔案內容:ABCDEFG
% d' v  p+ b0 Y8 s新檔案內容:CDEFGAB% k. ?+ l5 D" e
老大救救小弟哦% k" g, G7 B% Z3 R2 O0 k# k
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>
" A! f1 ?7 Y5 {" L- G$ Q0 T' q<>alloca:</P>
9 Y7 V$ S& \  i1 N1 |3 z9 Q<>Allocates temporary stack space.</P>2 \1 R% R, ^- x6 {* b0 _0 J* f
<>alloca allocates size bytes on the stack; the allocated space is automatically freed up when the calling function exits.</P>
5 K2 }# ~4 d+ d1 x<>malloc:</P>
% i* k, W$ A% ~. r) t6 q<>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>  k7 L7 u) k  }6 k" O' ^
<>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>: M- ^1 u4 t4 d3 B+ V& G3 e

! N8 f/ z2 U. V% j<>以下是改后的代码</P>
# s% \- \5 t, e) z' {% e# ~<>//---------------------------------------------------------------------------</P>  u$ g0 y* }% B/ ?: z. h
<>#include &lt;vcl.h&gt;3 V, V( m% ?0 A, J
#pragma hdrstop</P>
: o8 M& G8 m/ \8 M; u; b: L6 e<>#include "Unit1.h"0 u3 c9 F! a/ K( ]- s" P! o
#include &lt;fstream.h&gt;+ N# c. F, ~: m$ l0 O( M
#include &lt;dir.h&gt;
5 B- a: ?# `% _% O2 v#include &lt;sys\stat.h&gt;) w4 i& B- f+ m
#include &lt;malloc.h&gt;9 ]$ h: \9 |7 p& g# |: t
//---------------------------------------------------------------------------- ]: `3 \8 b- N3 I) K! m9 D# b' h" b3 E
#pragma package(smart_init)& W  B$ r( i1 {8 w6 [
#pragma resource "*.dfm"' ?& ]$ f; `* K0 D1 [
TForm1 *Form1;
) r, `1 V# H4 y/ [/ O, G. G; M        unsigned char *BIN_Byte;6 F; `) h: p) |' X. u& j
        long BIN_Byte_Len;
; W4 A5 ?% k8 h//---------------------------------------------------------------------------, P  q1 a2 m* `
__fastcall TForm1::TForm1(TComponent* Owner): D/ c$ {! L2 X6 e8 y* Z2 P2 X
        : TForm(Owner); ?7 s3 u5 L& P# j/ N
{/ l- J' D* ~) n; b
}6 W9 A) n* r! W
//---------------------------------------------------------------------------# u3 j+ |2 O/ A0 F/ Y$ _4 C' B( r/ k# v2 V
void __fastcall TForm1::Button1Click(TObject *Sender), _) p$ |1 ?. s  G
{
2 J8 X. U( m; V6 k# _2 S        char sPath[MAXPATH];
! q3 C5 s' V* T  z        struct stat statbuf;6 Z0 Z. k$ R3 [+ o# I* Z
        FILE *stream;</P>  Z% ~8 Z8 J9 d5 b; m& K% `
<>        getcwd(sPath,sizeof(sPath));0 K3 A6 ^5 x+ j# n
        OpenDialog1-&gt;InitialDir=sPath;
. s3 L1 ?9 O% l) I- x. Y' x        OpenDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";1 _* d- [3 G% H* ?2 m3 G
        OpenDialog1-&gt;FileName="fileFrom.BIN";) P5 _& U; Z) S' t/ p# {
        if(OpenDialog1-&gt;Execute())
+ m; L1 F  T5 \9 g- ~+ E8 c& w        {
0 X" g9 O! x: \! Z% i: B4 q$ E! [                strcpy(sPath,OpenDialog1-&gt;FileName.c_str());7 s) c) a7 Y# ?# J" Y" C' U
                stream=fopen(sPath,"rb");
: |  u' P; |7 W3 G  K/ b; j                fstat(fileno(stream),&amp;statbuf);# Z+ e; y. G: I  U) i2 M& O: D7 I
                BIN_Byte_Len=statbuf.st_size;
; |8 D3 Z* L8 w& t# X                BIN_Byte=(unsigned char *)malloc(BIN_Byte_Len);
6 N. N3 n% `( r& L- T5 N0 g                for(int i=0;i&lt;BIN_Byte_Len;i++)
' ]- b$ g7 |6 Y& D9 {                        fscanf(stream,"%c",&amp;BIN_Byte); //read file
% R8 ?5 g  F6 L5 G6 t                fclose(stream);
" J: k# l  r7 c! M: Y        }% t" d/ A" D1 ~+ x) y) r8 O
}
5 i& h! u$ F4 \/ A9 B. K//---------------------------------------------------------------------------8 I0 B/ v8 z% @7 b4 P4 o+ \  T' b' r. J
void __fastcall TForm1::Button2Click(TObject *Sender)
! I1 C: Z; G$ X9 j{
# A* z; o% s# r9 \$ E        char sPath[MAXPATH];
$ {$ L, A- {' ?& |7 K        FILE *stream;
) `1 c" U% ~1 T& l, n; W$ P& ~        getcwd(sPath,sizeof(sPath));//App.Path0 T( F$ d7 w2 H0 K7 [( t/ c+ h
        strcat(sPath,"\\");6 F: S4 |6 G0 F4 L* b6 ?4 U
        SaveDialog1-&gt;InitialDir = sPath;  Q  V9 O; |( \$ T. S
        SaveDialog1-&gt;Filter = "BIN_File(*.BIN)|*.BIN|All_File(*.*)|*.*";
/ t/ {) k; q; o5 f# `. a        SaveDialog1-&gt;FileName="fileTo.BIN";% X- I. p- X. o& Q3 a& v' T3 t( n$ u
        if(SaveDialog1-&gt;Execute())$ ~, g) t4 \/ P& o) Z
        {$ S& s8 A/ l. y* {1 z
                strcpy(sPath , SaveDialog1-&gt;FileName.c_str());% Y# N" e( S) N* V; Q* s
                stream=fopen(sPath,"wb");. ^( |) m9 O9 s% g8 G6 c' b1 Y( T9 M
                for(int i=0;i&lt;BIN_Byte_Len;i++)- m: g* ?8 {, k; e" \8 M
                        fprintf(stream,"%c",BIN_Byte);  //save file
# K; V0 I3 s% ]; M' L( {                fclose(stream);" K5 i. B% q- H
        }
+ a6 T1 y6 O' E+ k1 n4 m7 h; ]1 e        free(BIN_Byte);3 g1 c+ j7 ]$ o1 ]
}
3 F- E$ V4 k( e% s; H) H//---------------------------------------------------------------------------
5 [, R, R" X! Z. R! _void __fastcall TForm1::FormDestroy(TObject *Sender)- T9 e% g3 r3 |, p: A# L
{4 q: @: O4 r$ z, o4 r, L
        if (BIN_Byte!=NULL)
3 h- ]( b' R& e( O6 I- g* M9 U/ o* S1 r             free(BIN_Byte);% o; g3 m+ n2 E: d
}
* A1 P) f$ B1 i3 z//---------------------------------------------------------------------------0 V" `4 n! S% P# W3 [
</P># |. `! x0 c( Q$ T8 T* t2 l5 }
<>free(sPath); free(stream);此两句也有问题。</P>* i$ F8 @* b- P0 y+ i! C5 Q: Q* ?$ ~
<>char sPath[MAXPATH];不需要释放;</P>
7 _# Q; n" w( ?) c7 c<>fclose(stream)已经起到free(stream)的作用</P>- ]( G9 T/ M+ A" I. w
[此贴子已经被作者于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 11:49 , Processed in 0.517689 second(s), 83 queries .

回顶部