精华内容
下载资源
问答
  • C语言文件输入输出读取中文TXT文件出现乱码

    万次阅读 多人点赞 2018-03-17 19:18:37
    今天在实现一个倒序输出文件的程序时测试了英文数字和中文,唯独中文出现了乱码,源码如下//倒序显示文件的内容 #include<stdio.h> #include<stdlib.h> #define CNTL_Z '\032' //文件...

    今天在实现一个倒序输出文件的程序时测试了英文数字和中文,唯独中文出现了乱码,源码如下

    //倒序显示文件的内容
    #include<stdio.h>
    #include<stdlib.h>
    #define CNTL_Z '\032'   //文件结尾标记
    #define SLEN 81
    int main()
    {
    char file[SLEN];
    char ch;
    FILE *fp;
    long count,last;
    
    puts("Enter the name of the file to be processed:");
    scanf("%80s",file);
    if((fp=fopen(file,"rb"))==NULL)
    {
    printf("reverse can't open %s\n",file);
    exit(EXIT_FALLURE);
    }
    fseek(fp,0L,SEEK_END);  //定位到文件末尾
    last=ftell(fp);
    for(count=1L;count<=last;count++)
    {
    fseek(fp,-count,SEEK_END);
    ch=getc(fp);
    if(ch!=CNTL_Z && ch!='\r')
    putchar(ch);
    }
    putchar('\n');
    fclose(fp);
    return 0;
    }

    如果明白原理其实很简单,汉字ANSI编码一个汉字对应两个字节,但是传统char类型只有一个字节,即putchar()只能输出汉字的一半,也就变成乱码了。
    下面的代码很好理解了
    int main()
    {
    	FILE *p;
    	char file[50];
    	scanf("%80s", file);
    	p = fopen(file, "r");
    	int i = 0;
    	char a[1000];
    	while ((a[i] = fgetc(p)) != EOF)
    		i++;
    	a[i] = '\0';
    	puts(a);
    	printf("\n\n");
    	for (int j = 0; j <= i - 1; j++)
    		printf("%c   ", a[j]);
    	system("pause");
    	return 0;
    }

    第一次输出是正常的,而第二次输出就是乱码
    至于怎么解决,把汉字看做字符串就可以了,或者两个字节一输出

    如果你们有更好的想法,请留言告诉我
    展开全文
  • C语言读取中文汉字

    万次阅读 2018-08-05 11:48:33
    一般的来说,一个汉字占两个字节,数字和字母都占一个字节,但是有一点是,汉字的两个字节如果转换成整型都是负数,也就是说,用按字节读取文件,然后判断字节的正负,如果一个字节对应的整型是负的,那么一连读取两...

    一般的来说,一个汉字占两个字节,数字和字母都占一个字节,但是有一点是,汉字的两个字节如果转换成整型都是负数,也就是说,用按字节读取文件,然后判断字节的正负,如果一个字节对应的整型是负的,那么一连读取两个字符,如果这个字节是正的,那么就读取这一个字节就好了

     

     

     

     

    展开全文
  • 15.19 从C语言读取文件对象¶ 问题¶ 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件、StringIO对象等)。 解决方案¶ 要读取一个类文件对象的数据,你需要重复调用 read() 方法,...

    15.19 从C语言中读取类文件对象

    问题

    你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件、StringIO对象等)。

    解决方案

    要读取一个类文件对象的数据,你需要重复调用 read() 方法,然后正确的解码获得的数据。

    下面是一个C扩展函数例子,仅仅只是读取一个类文件对象中的所有数据并将其输出到标准输出:

    #define CHUNK_SIZE 8192
    
    /* Consume a "file-like" object and write bytes to stdout */
    static PyObject *py_consume_file(PyObject *self, PyObject *args) {
      PyObject *obj;
      PyObject *read_meth;
      PyObject *result = NULL;
      PyObject *read_args;
    
      if (!PyArg_ParseTuple(args,"O", &obj)) {
        return NULL;
      }
    
      /* Get the read method of the passed object */
      if ((read_meth = PyObject_GetAttrString(obj, "read")) == NULL) {
        return NULL;
      }
    
      /* Build the argument list to read() */
      read_args = Py_BuildValue("(i)", CHUNK_SIZE);
      while (1) {
        PyObject *data;
        PyObject *enc_data;
        char *buf;
        Py_ssize_t len;
    
        /* Call read() */
        if ((data = PyObject_Call(read_meth, read_args, NULL)) == NULL) {
          goto final;
        }
    
        /* Check for EOF */
        if (PySequence_Length(data) == 0) {
          Py_DECREF(data);
          break;
        }
    
        /* Encode Unicode as Bytes for C */
        if ((enc_data=PyUnicode_AsEncodedString(data,"utf-8","strict"))==NULL) {
          Py_DECREF(data);
          goto final;
        }
    
        /* Extract underlying buffer data */
        PyBytes_AsStringAndSize(enc_data, &buf, &len);
    
        /* Write to stdout (replace with something more useful) */
        write(1, buf, len);
    
        /* Cleanup */
        Py_DECREF(enc_data);
        Py_DECREF(data);
      }
      result = Py_BuildValue("");
    
     final:
      /* Cleanup */
      Py_DECREF(read_meth);
      Py_DECREF(read_args);
      return result;
    }
    

    要测试这个代码,先构造一个类文件对象比如一个StringIO实例,然后传递进来:

    >>> import io
    >>> f = io.StringIO('Hello\nWorld\n')
    >>> import sample
    >>> sample.consume_file(f)
    Hello
    World
    >>>
    

    讨论

    和普通系统文件不同的是,一个类文件对象并不需要使用低级文件描述符来构建。
    因此,你不能使用普通的C库函数来访问它。
    你需要使用Python的C API来像普通文件类似的那样操作类文件对象。

    在我们的解决方案中,read() 方法从被传递的对象中提取出来。
    一个参数列表被构建然后不断的被传给 PyObject_Call() 来调用这个方法。
    要检查文件末尾(EOF),使用了 PySequence_Length() 来查看是否返回对象长度为0.

    对于所有的I/O操作,你需要关注底层的编码格式,还有字节和Unicode之前的区别。
    本节演示了如何以文本模式读取一个文件并将结果文本解码为一个字节编码,这样在C中就可以使用它了。
    如果你想以二进制模式读取文件,只需要修改一点点即可,例如:

    ...
    /* Call read() */
    if ((data = PyObject_Call(read_meth, read_args, NULL)) == NULL) {
      goto final;
    }
    
    /* Check for EOF */
    if (PySequence_Length(data) == 0) {
      Py_DECREF(data);
      break;
    }
    if (!PyBytes_Check(data)) {
      Py_DECREF(data);
      PyErr_SetString(PyExc_IOError, "File must be in binary mode");
      goto final;
    }
    
    /* Extract underlying buffer data */
    PyBytes_AsStringAndSize(data, &buf, &len);
    ...
    

    本节最难的地方在于如何进行正确的内存管理
    当处理 PyObject * `` 变量的时候,需要注意管理引用计数以及在不需要的变量的时候清理它们的值。
    ``Py_DECREF()
    的调用就是来做这个的。

    本节代码以一种通用方式编写,因此他也能适用于其他的文件操作,比如写文件。
    例如,要写数据,只需要获取类文件对象的 write() 方法,将数据转换为合适的Python对象
    (字节或Unicode),然后调用该方法将输入写入到文件。

    最后,尽管类文件对象通常还提供其他方法(比如readline(), read_info()),
    我们最好只使用基本的 read()write() 方法。
    在写C扩展的时候,能简单就尽量简单。

    艾伯特(http://www.aibbt.com/)国内第一家人工智能门户

    转载于:https://www.cnblogs.com/aibbtcom/p/8542750.html

    展开全文
  • C语言读取excel文件

    千次阅读 2020-04-22 14:36:21
    将Excel文件另存为*.csv文件(是和txt一样,以二进制文本形式存储,它是以都逗号分隔符做个单元格内容的划分),这里要特别注意在另存为时,会有两个关于csv的选项,如果需要在C语言中,读取中文,需要选择 CSV(逗号...

    步骤

    1. 将Excel文件另存为*.csv文件(是和txt一样,以二进制文本形式存储,它是以都逗号分隔符做个单元格内容的划分),这里要特别注意在另存为时,会有两个关于csv的选项,如果需要在C语言中,读取中文,需要选择 CSV(逗号风格)(*.csv)。CSV UTF-8格式,在C语言中中文会出现乱码。
      在这里插入图片描述
    2. 在C语言中使用FILE,读取数据。将表格数据存入数组中。细节见代码注释:
    #define maxFactorNumber 128 //最大因素个数
    //这里需要存储字符串的值到数组,所以不能写成typedef char * Matrix[maxYSNumber][maxYSNumber];
    //否则只能保存引用。一旦被引用的字符串发生变化,就会产生意想不到的结果。
    typedef char Matrix[maxFactorNumber][maxFactorNumber][128];
    
    //从cvs文件中读取矩阵信息
    void readMatrix(char * filePath,Matrix m)//读取文件内容到矩阵m
    {
    	FILE *fp = NULL;
    	char *line,*record;
    	char buffer[1024];
    	int x=0,y=0,n=0;
    
    	if ((fp=fopen(filePath,"r")) != NULL)
    	{
    		char delims[] = ",";
    		wchar_t *result = NULL;
    		while (line = fgets(buffer, sizeof(buffer), fp))//当没有读取到文件末尾时循环继续
    		{
    			line[strlen(line)-1]='\0';//去除\r\n,无法通过查找\r或\n来处理,但确实先执行\r,将光标移动到第一个字符钱,然后往下一行。可能vc2010对回车的解释看做一个字符?
    			record = strtok(line, ",");
    			while (record)//读取每一行的数据
    			{
    				memcpy(m[x][y],record,128);//考虑到小数点以及结束符,使用128,而不要用sizeof。
    				record = strtok(NULL, ",");	
    				y++;
    			}
    			y=0;
    			x++;
    		}
    		fclose(fp);
    		fp = NULL;
    	}
    }
    
    展开全文
  • c语言feek函数读取中文出现乱码 在文件操作的学习中,发现读取文件的中文时会出现乱码 当输入的文字改成英文时则不会出现乱码,于是猜想是否和中文与英文占用的字节有关系,实践得出结论,的确是字节搞的鬼,那么...
  • C语言实现读取FAT12文件系统

    万次阅读 热门讨论 2013-04-07 18:58:26
    假设要读取的FAT12文件系统的映像文件为跟程序在同一目录下的 a.img : /*文件名不支持中文及符号。*/ #include #include #include typedef unsigned char u8; //1字节 typedef unsigned short u16; //2字节 ...
  • C语言文件读取——电子词典实现

    千次阅读 2018-11-14 20:46:54
    char e[8000][20],c[8000][20]//英文和中文数组,要由文件读入 int wordsNum = 0;//词库中实际的词汇条款 int BinSearch(int low,int high,char *key); 文件的打开与关闭   int main() { char key [20]...
  • 与字符串比对时,要给字符串后边 strcat上 \n 在这里插入代码片#include <stdio.h>...//读取一行到buf } void someprocess(char *buf) { printf("%s", buf);//这里的操作你自己定义 } int main
  • C语言读取BMP文件最关键的是要理解结构体对齐。一般情况下,C语言的结构体在内存中会按照4字节(32位)或者8字节(64位)对齐。BMP文件的数据头结构体按照字节排列,而且不能对齐,所以需要用预编译宏设置不能对齐。...
  • C语言课程设计要求使用文件,然后在我进行文件操作的时候发生了一点小小的意外,读写文件中的汉字显示的居然是乱码。 经过我的一番查找之后发现居然是txt编码方式的问题。 为使计算机支持更多语言,通常使用 0x80~0...
  • printf("文件打开失败!\n"); sleep(3); exit(1); } int length = 0; fseek(fp, 0L, SEEK_END); length = ftell(fp); fseek(fp, 0L, SEEK_SET); char* str = (char*)calloc(length + 1, ...
  • C语言读取text文档

    2020-02-25 11:01:17
    一、读取不同的数据类型信息 1、打开文档 `FILE *fpRead = fopen("Student.txt", "r");//打开文档 if (fpRead == NULL) { printf("抱歉,文件因为某些原因...将TXT文档另存为ANSI编码进行读取并显示中文字符 ...
  • 问题:输出中文字符乱码 今天从txt读中文到字符串数组里输出发现中文是乱码,原本以为是读入方式的问题,结果是文件本身的问题,令人抓狂!!!!!!
  • C语言中对文件中文内容进行读出

    万次阅读 多人点赞 2018-03-29 12:58:34
    //对文件中文内容进行读出 按字符方式读取文件,每读一个字符判断一下是否为汉字编码(&lt;0),若是则存入字符数组,不是则跳过读取下一个字符,直到文件结束。 #include "stdio.h" #include "...
  • c语言中文文件的读、写、追加

    千次阅读 2020-02-22 22:28:40
    c语言的编程中,我们有时候需要用到文件的操作。文件可以分为文本文件和二进制文件,这篇文章主要是讲解对文本文件的操作。 这里主要将解三个比较常见的操作读(r)、写(W)和追加(a)。 读(r):就是将数据从文件...
  • C语言关于中文字符串的使用误区 背景 前几天在写c语言代码进行...在文件读取的时候,utf-8ANSI编码的中文读入到字符串的结果是不一样的。 UTF-8 ANSI 因此utf-8和ansi以及unicode对于中文汉子的编码方式是一样的,
  • C语言读写中文时出现乱码的解决

    千次阅读 2020-12-07 21:14:17
    之前一直以为读取中文时变成乱码时因为读取文件时字符串长度不足,或者是文件中中文格式不对,上网百度以后发现是TXT格式文件在创建时默认编码为UTF-8,这导致在读取文件时编码格式不对应而造成读取中文时出现乱码 ...
  • 文件的复制是常用的功能 要求写一段代码 ...开辟一个缓冲区 不断从原文件读取内容到缓冲区 每读取 完一次就将缓冲区中的内容写入到新建的文件 直到把原文件的内容读取完 这里有两个关键的问题需要解决 1 开辟多大...
  • 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小?  声明问题  1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。  *1.26 main的正确定义是...
  • C语言调用中文字库显示

    千次阅读 2019-04-10 14:24:03
    本来想将bin文件放入arm下,用于在LCD屏上显示的,but貌似linux下的bin文件读取貌似和windows不一样 已经成功在windows编译器上显示出了中文如下: 代码如下: #include<stdio.h> #include <sys/types....
  • php读取二进制文件中文字符串乱码,![图片说明](https://img-ask.csdn.net/upload/201903/06/1551846754_689716.png) 编码不管设置成utf8还是gbk都显示乱码 ![图片说明]...
  • 之前一直以为读取中文时变成乱码时因为读取文件时字符串长度不足,或者是文件中中文格式不对,上网百度以后发现是TXT格式文件在创建时默认编码为UTF-8,这导致在读取文件时编码格式不对应而造成读取中文时出现乱码 ...
  • C/C++中读取中文路径文件的方法

    万次阅读 2011-11-03 10:14:35
    有时候用ifstream或ofstream打开带有中文路径的文件会失败。 解决办法: 1、使用C语言的函数设置为中文运行环境 setlocale(LC_ALL,"Chinese-simplified"); 2、使用STL函数设置为系统语言环境 std::locale::...
  • 是的,有Knocker所说的问题,因为非中文字符还是一个字节的,所以当遇到一个字节的字符,会将其和后面的一字节连着读出来,打乱了字符的分隔.我还是贴出代码:#include#include#includeFILE *in;int ai;struct rel{int i;...
  • C语言学习笔记

    2017-02-19 11:12:00
    http://c.biancheng.net/cpp/ c语言中文网 ... 1.1, C语言的编译器 ...所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成系统可以执...
  • gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。【返回值】若成功则返回string的指针,否则返回NULL。注意:由于gets()不检查...
  • 我用包含非拉丁字符的UTF-8文件测试它似乎工作,但我不知道它是否适用于中文字符.有关更多信息,请查看以下链接:_setmode和codecvt_utf8.#include #include #include #include #include #include #include using ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

c语言文件读取中文

c语言 订阅