Linux文件IO细节之write写文件后原有内容变成了乱码

问题描述
虚拟机:VMware10.0.2 build-1744117
Linux :Ubuntu14.04.01

在Windows7中 通过Linux和Windows的共享文件夹使用notepad++编写C程序如下:

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


int main(int argc, char *argv[])
{
    
       
    char wbuf[] = "I love linux\nkkdud\n";
    char buf[100] = {
    
    0};
    int ret = -1;
    int fd = -1;        
    //打开文件
    fd = open("a.txt", O_RDWR | O_APPEND);
    if (-1 == fd)
    {
    
    
        printf("文件打开错误\n"); 
        _exit(-1);
    }
    else 
    {
    
    
        printf("文件打开成功,fd = %d\n", fd);        
    }

    //读写文件
    ret = write(fd, wbuf, strlen(wbuf));
    if (ret < 0)
    {
    
    
        printf("write失败\n");
        _exit(-1);
    }
    else
    {
    
    
        printf("实际写入%d字节\n", ret);
    }  
    
    //关闭文件
    close(fd);

   
    return 0;
}

 


在Linux终端里
gcc a.c 生成a.out
touch a.txt
./a.out

I love linux                                                                                       
kkdud

在执行一次
./a.out

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@I love linux                                                   
kkdud

多次执行发现很多时候都是把原有的内容变成了乱码,写入的倒是没错。

测试现象
经过多次测试发现以下现象:

  1. 连续快速多次执行一般不会出错;
  2. 用notepad++打开 a.c和 a/txt 文件时出错几率大大增加;
  3. 不用notepad++打开也会出错,但几率不高;
  4. 在使用notepad++打开 a.c和a.txt 前提下在一次运行里多次打开文件写入不会出错;
  5. 只有在共享文件夹里多次执行一个这样的程序时会出错;
  6. 将a.c a.out a.txt 复制到非共享文件夹下执行不会发生错误。

正常执行结果

I love linux                                                                                       
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud

原因分析
是因为Windows和Linux在文档编辑上某些不一致造成的,而Ubuntu共享文件夹并没有对此做优化,以至于出现写入问题。

猜你喜欢

转载自blog.csdn.net/m0_50399735/article/details/108272127