C 语言文件读写实验记录

对于一个dat的二进制文件,现在我们来读取分析其内容

1.    fseek(fp,0L,SEEK_END); /* 定位到文件末尾 */
    long len =ftell(fp);
    printf("len:%ld\n",len);

函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。结合fseek,可以得到文件内容长度。单位为字节。

每次操作之前注意此时文件指针位置。


2.fread (void *ptr, size_t size, size_t nmemb, FILE *stream)

注意void *ptr,是内存地址,不是变量!


    short buffer[2000]={1};
    /* 打开文件用于读写 */
    /* 读取并显示数据 */
    fread(buffer, 2, 1, fp);
    printf("%hd\n", buffer[0]);


    short b;
    short *a=&b ;
    /* 读取并显示数据 */
    fread(a, 2, 1, fp);
    printf("%hd\n", b);

类似的,我们可以直接:

fread(&b, 2, 1, fp);

printf("%hd\n", b);


3.注意判断自身读取文件时候是处于大端模式还是小端模式,而数据文件又是什么模式!


4.我们可以设施主函数参数,用来携带路径使用:

int main(int argc, char* argv[]){
    FILE *fp;
    /* 打开文件用于读写 */
    scanf("%s",argv[0]);
//    fp = fopen("/MySpotFi/csi1022.dat", "rb");
    fp=fopen(argv[0], "rb");}

argc记录了用户在运行程序的命令行中输入的参数的个数。   
arg[]指向的数组中至少有一个字符指针,即arg[0].他通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序
文件所在的路径。

>./test   
这个argc的值是1   
但是   
>./test  myarg1   myarg2  

这里argc的值是3。也就是   命令名   加上两个参数 myarg1   myarg2,一共三个参数  
char   *argv[]   
这用来取得你所输入的参数   
>./test   
这个时候,argc的值是1,argv[0]的值是   "test"   
>./test   myarg1   myarg2   
这个时候,argc的值是3,argc[0]的值是"test",argc[1]的值是"myarg1",argc[2]的值是"myarg2"

1、int main(int argc,char *argv)与int main(int argc,char **argv)区别?

     

int main(int argc,char *argv)

  argc: 整数,用来统计你运行程序时送给的命令行参数的个数

  * argv: 字符串,用来存放指向你的字符串参数的,每一个元素指向一个参数

  argv[0] 指向程序运行的全路径名

  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串

  argv[2] 指向执行程序名后的第二个字符串

     

  int main(int argc,char **argv) 相当于  int main(int argc,char *argv[ ] )

     argc: 整数,用来统计你运行程序时送给的命令行参数的个数

  * argv: 字符串,用来存放指向你的字符串参数的,每一个元素指向一个参数

  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串的指针

  argv[2] 指向执行程序名后的第二个字符串的指针

      在int main(int argc,char **argv)中 argv[1]是一个指针,存的内容是一个地址,而在int main(int argc,char

       *argv)中argv[1]是一个数组元素

这段来自 https://www.cnblogs.com/ruixingw/p/3705918.html


5.Mac os下编译后产生的Unix文件,只能再MacOS下使用,实测交给另一台macOS可以运行,报没有相关三方库。但是给Ubuntu上使用时候却无法识别,报commend not found

这是因为MacOS下生成的Unix可执行文件和Ubuntu下并不可以通用,不仅如此,在从MacOS下拷贝静态库的.a文件到Ubuntu下也不可以使用,虽然Ubuntu下也有.a文件,但是和MacOS下的.a并不同,也许是封装格式原因,有待后续了解。


6.注意我们其实也可以按字节读取,

    short field_len=0;
    short code=0;
    bool flag=EndianInThere();

    while(condition){
        fread(&field_len, 2, 1, fp);//已知两字节存文件长度
        if(!flag){//对于判断后的大小端,针对已知存储,调整高低8位
            field_len=((field_len&0x00ff)<<8)+((field_len&0xff00)>>8);
        }
        fread(&code, 1, 1, fp);//只读一个字节,只是short使用,我小端模式下,低8位是数据,高8位就是0了。

判断大小端:

bool EndianInThere(){
    union NUM{
        int a;
        char b;
    }num;
    num.a = 0x1234;
    if( num.b == 0x12 ){
        //printf(" This is big-endian,return true flag; \n");
        return true;
    }else if( num.b == 0x34){
        //printf("This is little-endian,return false flag;\n");
        return false;
    }else{
         printf("不是大端也不是小端,你这个方法有误啊\n");
         exit(1);
    }
}


 


7.值得中注意的的是,如果你要立刻使用刚刚传输过来的文件,需要fflush();将内存中内容刷新到硬盘,这样,read才是文件内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 1. 学习磁盘文件读写操作; 2. 掌握文件读写的基本原理和方法; 3. 熟悉文件读写C语言库函数。 实验环境: 操作系统:Windows 10 编程语言C语言 实验原理: 磁盘是计算机系统重要的外部存储设备,用于存储大量的数据和程序。在磁盘上,所有的数据都是以文件的形式存储的。文件是计算机系统数据的基本单位,通过对文件读写操作,可以对数据进行处理和管理。 文件读写的基本原理是通过文件指针来对文件进行读写文件指针是一个指向文件的指针变量,用于记录文件读写的位置。在C语言,使用fopen()函数打开文件后,可以使用fseek()函数来设置文件指针的位置,使用fread()函数读取文件内容,使用fwrite()函数向文件写入内容,使用fclose()函数关闭文件实验内容: 本次实验主要包括以下内容: 1. 创建一个文本文件,并在其写入一些字符串; 2. 读取文件的内容,并输出到控制台; 3. 修改文件的内容; 4. 关闭文件。 下面是具体的实验步骤: Step 1:创建一个文本文件并写入内容 ```c #include <stdio.h> int main() { FILE *fp; char str[] = "Hello World!\n"; fp = fopen("test.txt", "w"); if(fp == NULL) { printf("Failed to open file.\n"); return 0; } fwrite(str, sizeof(str), 1, fp); fclose(fp); return 0; } ``` 在该程序,首先使用fopen()函数打开一个名为“test.txt”的文件,并以写入模式打开。如果文件打开失败,则输出错误信息并退出程序。接下来,使用fwrite()函数将字符串“Hello World!”写入文件,并使用fclose()函数关闭文件。 Step 2:读取文件内容并输出 ```c #include <stdio.h> int main() { FILE *fp; char str[100]; fp = fopen("test.txt", "r"); if(fp == NULL) { printf("Failed to open file.\n"); return 0; } fread(str, sizeof(str), 1, fp); printf("%s", str); fclose(fp); return 0; } ``` 在该程序,首先使用fopen()函数打开名为“test.txt”的文件,并以读取模式打开。如果文件打开失败,则输出错误信息并退出程序。接下来,使用fread()函数读取文件的内容,并将其存储到char类型的数组str。最后,使用printf()函数输出读取到的字符串,并使用fclose()函数关闭文件。 Step 3:修改文件内容 ```c #include <stdio.h> int main() { FILE *fp; char str[] = "Hello World Again!\n"; fp = fopen("test.txt", "w"); if(fp == NULL) { printf("Failed to open file.\n"); return 0; } fwrite(str, sizeof(str), 1, fp); fclose(fp); return 0; } ``` 在该程序,首先使用fopen()函数打开名为“test.txt”的文件,并以写入模式打开。如果文件打开失败,则输出错误信息并退出程序。接下来,使用fwrite()函数将新的字符串“Hello World Again!”写入文件,并使用fclose()函数关闭文件。 Step 4:关闭文件 在前面的程序,我们已经使用了fclose()函数来关闭文件。在实际操作,必须在完成对文件读写操作后及时关闭文件,以避免出现文件读写错误或数据丢失的情况。 实验结果: 在进行完上述操作后,我们可以打开“test.txt”文件,发现其内容已经被修改为“Hello World Again!”。这表明我们已经成功地完成了磁盘文件读写操作。 结论: 本次实验通过对磁盘文件读写操作,让我们更加深入地了解了文件读写的基本原理和方法,并熟悉了文件读写C语言库函数。在实际编程文件操作是一个非常重要的环节,需要仔细处理,以保证程序的正常运行和数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值