关于fopen函数的问题,打开文件后文件长度为0,详细请看补充

关于fopen函数的问题,打开文件后文件长度为0,详细请看补充,第1张

文件存在

②文件名错误,打开文件的名字应该写成"c:\\filetxt",而不是"c:\filetxt";

③代码错误;

fopen函数用于打开文件并获取文件的指针,以便对文件进行 *** 作。

函数原型:file

fopen(const

char

path,const

char

mode);

参数:path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r

以只读方式打开文件,该文件必须存在。

r+

以可读写方式打开文件,该文件必须存在。

rb+

读写打开一个二进制文件,允许读写数据,文件必须存在。

w

打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+

打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a

以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(eof符保留)

a+

以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

(原来的eof符不保留)

wb

只写打开或新建一个二进制文件;只允许写数据。

wb+

读写打开或建立一个二进制文件,允许读和写。

ab+

读写打开一个二进制文件,允许读或在文件末追加数据。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b

字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有s_irusr|s_iwusr|s_irgrp|s_iwgrp|s_iroth|s_iwoth(0666)权限,此文件权限也会参考umask值。

有些c编译系统可能不完全提供所有这些功能,有的c版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。

返回值:

文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回null,并把错误代码存在errno中。

一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。

示例:以只读方式打开文件

#include

#define

f_path

"d:\\myfile\\filedat"

int

main(void)

{

filefp=null;//需要注意

fp=fopen(f_path,"r");

if(null==fp)

{

return

-1;//要返回错误代码

}

fclose(fp);

fp=null;//需要指向空,否则会指向原打开文件地址

return

0;

}

在项目中,需要做一个下载中间件,查看资料发现libcurl很适合,因此选用libcurl来实现>

#include <stdioh>

#include <stdlibh>                   //最好加上这个头文件,里面有malloc和free函数

int countKeyChar(char buffer, char keyChar)

{

int i;

int cnt = 0;

for(i=0; buffer[i] != '\0'; i++)

{

if(buffer[i] = keyChar)

{

cnt++;

}

}

return cnt;

}

FILE openFile(char fileName, char openMethod)

{

FILE fp;

if((fp = fopen(fileName, openMethod)) == NULL)   //这边,用括号将fp = fopen括起来

{

printf("Cannot open file!\n");

return 0;

}

return fp;

}

void closeFile(FILE fp)

{

if(fp == NULL)

{

printf("No file!\n");

return;

}

fclose(fp);

}

int getFileLength(FILE fp)

{

int len;

fseek(fp, 0, SEEK_END);  

len = ftell(fp);

printf("%d",len);

return len;

}

char readData(FILE fp, int n)

{

int i;

char buffer;

buffer = (char )malloc(sizeof(char)  n + 1);

for(i=0; i<n; i++)

{

buffer[i] = fgetc(fp);

}

buffer[n] = '\0';

return buffer;

}

int main()

{

FILE fp;  

char keyChar; 

char buffer;  

char fileName[50];

int fileLen; 

int cnt;     

printf("Input file name: ");

scanf("%s", fileName);

getchar();  

printf("Input key character: ");

scanf("%c", &keyChar);

fp = openFile(fileName, "r");

fileLen = getFileLength(fp); 

buffer = readData(fp, fileLen);  

cnt = countKeyChar(buffer, keyChar);  

printf("The number of \'%c\': %d\n", keyChar, cnt);

free(buffer);  

closeFile(fp);

system("pause");

return 0;

}

你再试试,程序本身没什么问题,修改后的代码在vs2005中,可以获取文件大小

C语言获取文件长度及全部内容,参考代码如下:

         

       FILEfp;

       fp=fopen("localfile","rb");// localfile文件名       

       fseek(fp,0L,SEEK_END); / 定位到文件末尾 /

flen=ftell(fp); / 得到文件大小 /

p=(char )malloc(flen+1); / 根据文件大小动态分配内存空间 /

if(p==NULL)

{

fclose(fp);

return 0;

}

fseek(fp,0L,SEEK_SET); / 定位到文件开头 /

fread(p,flen,1,fp); / 一次性读取全部文件内容 /

p[flen]=0; / 字符串结束标志 / 

all:strchangeo

    gcc -o strchangeo -c strchangec

strchangeo:strchangec

    gcc -o strchange strchangeo

clean:

    rm -rf strchange o

File file = new File("文件路径");

Systemoutprintln(filelength());//输出的是文件的字节数

这样就可以获得文件的长度了

以上就是关于关于fopen函数的问题,打开文件后文件长度为0,详细请看补充全部的内容,包括:关于fopen函数的问题,打开文件后文件长度为0,详细请看补充、如何使用libcurl实现HTTP的GET方法获取文件长度、来个大神帮我调试一下吧。现在遇到的问题就是ftell怎么读文件长度都是-1,后续就不知道怎么办了。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9463581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存