-------linux open ----------

wensefu 2011-02-24 04:00:20
程序的目的是实现从一个txt文件当中逐行读取放到一个数组中,然后问题出现了,在现在的平台上fopen无法打开文件,于是就用linux中的open打开,文件是打开了,下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

char* filename[100];
int len=0;
int readData(int fd,char *buf)
{
return read(fd,buf,676);
}

void getAllFileName()
{

int j;
for(j=0;j<100;j++)
{
filename[j]=(char*)malloc(sizeof(char)*100);
}

int i=0;
int fd=open("e:/file.txt",O_RDONLY);
if(fd<0){
printf("file open failed.\n");
return;
}

char *buf=(char*)malloc(sizeof(char)*1024);
readData(fd,buf);
printf("buf:\n%s\n--------\n",buf);
char *temp=NULL;
while((temp=strtok(buf,"\n"))!=NULL){
temp=filename[len++];
}
close(fd);
}

int main()
{
getAllFileName();
int i=0;
for(;i<len;i++){
printf("%s\n",filename[i]);
}
for(i=0;i<100;i++){
free(filename[i]);
}
system("pause");
return 0;
}


运行截图:

问题:
1,后面怎么会打印两个相同的呢?
2, while((temp=strtok(buf,"\n"))!=NULL){ 这里编译器提示[Warning] assignment makes pointer from integer without a cast ,运行结果是字符串分割失败,请问我这样调用strtok有什么不对吗?

---ps,小弟本是做android的,公司突然让我去研究一下嵌入式的东西,说是人员不够,我都无语了...用惯了JAVA再来用C,真有不习惯,都已经两年没碰C了...
...全文
199 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
李迟 2011-02-25
  • 打赏
  • 举报
回复
问题应该出在strtok的使用上。
    char *tmp=NULL;
tmp = strtok(buf, "\n");
while (tmp != NULL)
{
int k;
buf = NULL; // 要置为NULL
printf("file name: %s\n", tmp); // 可以正确打印文件名称
//filename[k++] = tmp;
//printf("%s\n", filename[k++]); //这里打印不了。
tmp = strtok(buf, "\n");
}

使用楼主位那个程序,出现段错误。——gcc & fc10下测试。
正在继续测试中。。。。。。
wensefu 2011-02-25
  • 打赏
  • 举报
回复
网上查的关于read函数:
read函数原型:
ssize_t read(int fd,void *buf,size_t count)
1、如果读取成功,则返回实际读到的字节数。这里又有两种情况:一是如果在读完count要求字节之前已经到达文件的末尾,那么实际返回的字节数将小于count值,但是仍然大于0;二是在读完count要求字节之前,仍然没有到达文件的末尾,这是实际返回的字节数等于要求的count值。

2、如果读取时已经到达文件的末尾,则返回0。

3、如果出错,则返回-1。

code:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define NUM 60

void getAllFileName()
{

int fd=open("e:/file.txt",O_RDONLY);
if(fd<0){
printf("file open failed.\n");
return;
}

char *buf=(char*)malloc(sizeof(char)*100);
int count=0;
while(count!=-1&&(count=read(fd,buf,NUM)))
{
printf("count=%d\nbuf=\n%s\n",count,buf);
}
free(buf);
close(fd);
}

int main()
{
getAllFileName();
system("pause");
return 0;
}


output:
count=8
buf=
1
2
3
4

4

请按任意键继续. . .
如果在读完count要求字节之前已经到达文件的末尾,那么实际返回的字节数将小于count值,这样的输出是不是表示,实际返回的字节数是不确定的?
rwjlqn 2011-02-25
  • 打赏
  • 举报
回复
strtok最好别用 它是不可重入的 它是不安全的
李迟 2011-02-25
  • 打赏
  • 举报
回复
将楼主代码进行几处修改,可以正常获取文件名称,但是存在内存泄漏。
1、return read(fd,buf,1024); // 将数值改大一些
2、 while((temp=strtok(buf,"\n"))!=NULL){
buf = NULL;
filename[len++]=temp;

//temp=filename[len++];
} 将buf置为NULL(应该在while前面执行一次strtok,避免每次都给buf赋值)。
3、 for(i=0;i<100;i++){
free(filename[i]);
}

这个free造成double free的错误,如果注释掉,造成内存泄漏。

gcc & fc10测试,同时使用valgrind工具。
h248080441 2011-02-24
  • 打赏
  • 举报
回复
新手帮不上忙,有几个地方请教下
1。filename这个数组,LZ只是分配给了它100个空间,可是没有赋任何值。那
for(;i<len;i++){ printf("%s\n",filename[i]);不是没有任何作用吗
2。char *buf=(char*)malloc(sizeof(char)*1024);
readData(fd,buf);
printf("buf:\n%s\n--------\n",buf);
这段是把文件里的内容缓存到buf上然后打印出来。是这样吗?
3。 while((temp=strtok(buf,"\n"))!=NULL){
temp=filename[len++];
这段不明白是什么意思。高手解释下
wensefu 2011-02-24
  • 打赏
  • 举报
回复
676是随意写的,可以读到文件的所有数据。
justkk 2011-02-24
  • 打赏
  • 举报
回复
"编译器提示[Warning] assignment makes pointer from integer without a cast"
需要包含头文件
#include <string.h>

你的文件不是定长的,使用read(fd,buf,676)可以吗?
read不会检查换行的..
这个676是什么根据?
wensefu 2011-02-24
  • 打赏
  • 举报
回复
file.txt:
AliIM2010_taobao(6.50.04C).exe
compose.html
constants.js
details.html
details_common.js
details_compose.js
details_view_controller.js
errorMessage.js
FeiQ.exe
foxmail65.exe
gadget.gmanifest
Gmail.gg.zip
GmailConfig.exe
httpRequest.js
Install_WLMessenger.exe
ITxiazai_GoogleDesktopSetup.exe
jdeclipse_update_site.zip
KuGou.exe
loginView.js
mailView.js
main.js
main.xml
message.js
netbeans-6.8-ml-javase-windows.exe
pdf_setup.zip
qhelper.exe
QQ2010SP3.1.exe
QQPCMgr_Setup_44_816_60143.exe
QQWubi_Setup_13_283.exe
resources.js
responseData.js
setup.exe
size_details_view.xml
thread.js
ui_mailView.js
urlBuilder.js
utils.js
豆丁文档下载器.zip

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧