Linux里打开文件出现乱码,Linux下关于文件操作出现乱码的问题

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define infile "infile.dat"

#define outfile "outfile.dat"

sem_t f1;

sem_t f2;

void inputdata()

{

int infd;

char buf[50];

if ((infd = open(infile, O_WRONLY | O_TRUNC | O_CREAT, 10700)) == -1)

{

printf("ERROR, OPEN READ FILE FAILED:%s \n", sys_errlist[errno]);

//printf("ERROR, OPEN READ FILE FAILED:%s \n", strerror(errno));

exit(255);

}

printf("Please enter the data:\n");

printf("(Ctrl+D -- quit)\n");

while(fgets(buf, sizeof(buf), stdin))

{

if (write(infd, buf, strlen(buf)) != strlen(buf)) {

printf("ERROR, WRITE FILE FAILED:%s \n", sys_errlist[errno]);

//printf("ERROR, WRITE FILE FAILED:%s \n", strerror(errno));

exit(255);

}

}

close(infd);

sem_post(&f1);

}

void copydata()

{

sem_wait(&f1);

int infd, outfd;

char buf[50];

if ((infd = open(infile, O_RDONLY))==-1)

{

printf("ERROR, OPEN READ FILE FAILED:%s \n", sys_errlist[errno]);

//printf("ERROR, OPEN READ FILE FAILED:%s \n", strerror(errno));

exit(255);

}

if ((outfd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, 10700))==-1)

{

printf("ERROR, OPEN WRITE FILE FAILED:%s \n", sys_errlist[errno]);

//printf("ERROR, OPEN WRITE FILE FAILED:%s \n", strerror(errno));

exit(255);

}

int count;

while((count = read(infd, buf, sizeof(buf))) > 0)

{

if (count != write(outfd, buf, count))

{

printf("ERROR, WRITE FILE FAILED:%s \n", sys_errlist[errno]);

//printf("ERROR, WRITE FILE FAILED:%s \n", strerror(errno));

exit(255);

}

}

close(infd);

close(outfd);

sem_post(&f2);

}

void showdata()

{

sem_wait(&f2);

int outfd;

char buf[50];

if ((outfd = open(outfile, O_RDONLY, 10700))==-1)

{

printf("ERROR, OPEN WRITE FILE FAILED:%s \n", sys_errlist[errno]);

//printf("ERROR, OPEN WRITE FILE FAILED:%s \n", strerror(errno));

exit(255);

}

int count;

printf("\nThe data in the file:\n");

memset(buf, 0, sizeof(buf));    /*初始化缓存为0*/

while((count = read(outfd, buf, sizeof(buf) - 1)) > 0)    /*防止读到的数据是50个字符,最后一个字符用于字符串结束标记 "\0" */

{

printf("count = %d\n", count);

printf("%s", buf);

memset(buf, 0, sizeof(buf));    /*初始化缓存为0*/

}

close(outfd);

}

int main(void)

{

pthread_t t1,t2,t3,t4;

sem_init(&f1,0,0);

sem_init(&f2,0,0);

pthread_create(&t1,NULL, (void *)showdata, NULL);

pthread_create(&t2,NULL, (void *)copydata, NULL);

pthread_create(&t3,NULL, (void *)inputdata, NULL);

pthread_join(t1,NULL);

return 0;

}

出现乱码,是字符串没有找到”\0″,即字符串结束标记;需要对缓存在读之前做初始化操作(初始化为0, 0 值等于”\0″),另一个方面,若文件中的字符大于缓存长度,所以每次读取都最大读取缓存长度减1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值