我是靠谱客的博主 标致抽屉,最近开发中收集的这篇文章主要介绍fopen文本模式和ftell,fseek的跨平台问题探讨,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

       当我们使用文本方式打开一个文本文件读取时,就不应该再使用ftell, fseek函数,因为这2个函数只适合于二进制模式 ,在文本模式下会因为系统的不同而产生不同的结果。

典型的文本方式打开比如:

     

FILE *fp = fopen("test.txt", "r");
FILE *fp2 = fopen("test2.txt", "rt");

        尝试在windows和linux编译并运行下面的测试程序,这个简单的程序就是从一个文本文件里,每次读取一个字符出来,并用ftell获取当前的位置:


#include <stdio.h>
#include <stdlib.h>

int main()
{
	FILE *fp = fopen("test.txt", "rt");
	char buffer[2];
	int cur;
	for(int i = 0; i < 5; i++)
	{
		fgets(buffer, sizeof(buffer), fp);
		cur = ftell(fp);
		printf("read:%s cur:%dn", buffer, cur);
	}
	fclose(fp);
	return 0;
}

           要处理的文本文件内容为:

hello_world

           请注意二进制格式为:

00000000h: 68 65 6C 6C 6F 5F 77 6F 72 6C 64 0A 0A          ; hello_world..


            Windows运行结果:

read:h cur:-1
read:e cur:0
read:l cur:1
read:l cur:2
read:o cur:3

             Linux运行结果:

read :h cur:1
read :e cur:2
read :l cur:3
read :l cur:4
read :o cur:5

               而且只有在文本换行符使用Linux方式时才会出现不一致,对于这个问题,微软的解释是:

When ftell() is used on a file opened in text mode that contains only linefeeds (0x0A) with no carriage returns (0x0D), ftell() may return an incorrect value on the first call, causing all subsequent return values to be wrong as well. Opening the file in binary mode eliminates this problem. A text file, by definition, contains CR-LF pairs that are condensed to single LF (linefeed) characters on input. A file that contains LF characters with no CR (carriage return) characters is an ill-formed text file and should be processed in binary mode.

            结论就是使用二进制方式读写才能保持一致了。

           



最后

以上就是标致抽屉为你收集整理的fopen文本模式和ftell,fseek的跨平台问题探讨的全部内容,希望文章能够帮你解决fopen文本模式和ftell,fseek的跨平台问题探讨所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部