fscanf 订阅
fscanf 函数原型为 int fscanf(FILE * stream, const char * format, [argument...]); 其功能为根据数据格式(format),从输入流(stream)中读入数据,存储到argument中,遇到空格和换行时结束。fscanf位于C标准库头文件中。 [1] 展开全文
fscanf 函数原型为 int fscanf(FILE * stream, const char * format, [argument...]); 其功能为根据数据格式(format),从输入流(stream)中读入数据,存储到argument中,遇到空格和换行时结束。fscanf位于C标准库头文件中。 [1]
信息
应    用
C语言中基本的文件操作
外文名
fscanf
函数名
fscanf
中文名
fscanf
功    能
用于读取数据
标准库
fscanffscanf 一般形式
int fscanf(FILE *stream, char *format[,argument...]);从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。整型,成功返回读入的参数的个数,失败返回EOF(-1)。 [3] 
收起全文
精华内容
下载资源
问答
  • 主要介绍了C语言中fgets和fscanf区别详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
  • fscanf()遇到空格怎么办? 以下就是一个例子 #include #include int main() { FILE *fpw=fopen("data1.txt","w"); if(fpw==NULL) { return 0; } char s[20]; gets(s); fprintf(fpw,"%s",s); ...
  • fscanf

    千次阅读 2020-10-26 16:51:52
    A = fscanf(fileID,formatSpec) 将打开的文本文件中的数据读取到列向量 A 中,并根据 formatSpec 指定的格式解释文件中的值。fscanf 函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。如果 ...

    读取文本文件中的数据

    全页折叠

    语法

    A = fscanf(fileID,formatSpec)

    A = fscanf(fileID,formatSpec,sizeA)

    [A,count] = fscanf(___)

    说明

    示例

    A = fscanf(fileID,formatSpec) 将打开的文本文件中的数据读取到列向量 A 中,并根据 formatSpec 指定的格式解释文件中的值。fscanf 函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。如果 fscanf 无法将 formatSpec 与数据相匹配,将只读取匹配的部分并停止处理。

    该文本文件由文件标识符 fileID 指示。使用 fopen 打开文件,指定字符编码,以及获取 fileID 值。读取文件后,请调用 fclose(fileID) 来关闭文件。

    示例

    A = fscanf(fileID,formatSpec,sizeA) 将文件数据读取到维度为 sizeA 的数组 A 中,并将文件指针定位到最后读取的值之后。fscanf 按列顺序填充 AsizeA 必须为正整数或采用 [m n] 的形式,其中 mn 为正整数。

    示例

    [A,count] = fscanf(___) 还将返回 fscanf 读取到 A 中的字段数。对于数值数据,这是已读取的值数。您可以将此语法与前面语法中的任何输入参数结合使用。

    示例

    全部折叠

    将文件内容读取到列向量中

    View MATLAB Command

    创建一个包含浮点数的示例文本文件。

    x = 100*rand(8,1);
    fileID = fopen('nums1.txt','w');
    fprintf(fileID,'%4.4f\n',x);
    fclose(fileID);

    查看文件的内容。

    type nums1.txt
    
    81.4724
    90.5792
    12.6987
    91.3376
    63.2359
    9.7540
    27.8498
    54.6882

    打开要读取的文件并获取文件标识符 fileID

    fileID = fopen('nums1.txt','r');

    定义要读取的数据的格式。使用 '%f' 指定浮点数。

    formatSpec = '%f';

    读取文件数据并按列顺序填充输出数组 Afscanf 在整个文件中重新应用格式 formatSpec

    A = fscanf(fileID,formatSpec)
    
    A = 8×1
    
       81.4724
       90.5792
       12.6987
       91.3376
       63.2359
        9.7540
       27.8498
       54.6882

    A 是一个包含该文件中的数据的列向量。

    关闭文件。

    fclose(fileID);

    将文件内容读取到数组中

    View MATLAB Command

    创建一个包含整数和浮点数的示例文本文件。

    x = 1:1:5;
    y = [x;rand(1,5)];
    fileID = fopen('nums2.txt','w');
    fprintf(fileID,'%d %4.4f\n',y);
    fclose(fileID);

    查看文件的内容。

    type nums2.txt
    
    2 0.9058
    3 0.1270
    4 0.9134
    5 0.6324

    打开要读取的文件并获取文件标识符 fileID

    fileID = fopen('nums2.txt','r');

    定义要读取的数据的格式和输出数组的形状。

    formatSpec = '%d %f';
    sizeA = [2 Inf];

    读取文件数据并按列顺序填充输出数组 Afscanf 在整个文件中重新使用格式 formatSpec

    A = fscanf(fileID,formatSpec,sizeA)
    
    A = 2×5
    
        1.0000    2.0000    3.0000    4.0000    5.0000
        0.8147    0.9058    0.1270    0.9134    0.6324
    
    fclose(fileID);

    转置该数组,以便 A 与文件中数据的方向匹配。

    A = A'
    
    A = 5×2
    
        1.0000    0.8147
        2.0000    0.9058
        3.0000    0.1270
        4.0000    0.9134
        5.0000    0.6324

    跳过文件中的特定字符

    跳过示例文件中的特定字符并仅返回数值数据。

    创建一个包含温度值的示例文本文件。

    str = '78°C 72°C 64°C 66°C 49°C';
    fileID = fopen('temperature.dat','w');
    fprintf(fileID,'%s',str);
    fclose(fileID);

    读取文件中的数字并跳过文本 °C。此外,还返回 fscanf 读取的值数。扩展的 ASCII 代码 176 表示度数符号。

    fileID = fopen('temperature.dat','r');
    degrees = char(176);
    [A,count] = fscanf(fileID, ['%d' degrees 'C'])
    fclose(fileID);
    
    A =
    
        78
        72
        64
        66
        49
    
    
    count =
    
         5

    A 是一个包含文件中的数值的向量。count 指示 fscanf 读取五个值。

    输入参数

    全部折叠

    fileID - 文件标识符
    整数

    已打开文本文件的文件标识符,指定为整数。使用 fscanf 读取文件之前,您必须使用 fopen 打开文件并获取 fileID

    数据类型: double

    formatSpec - 数据字段的格式
    字符向量 | 字符串标量

    文件中数据字段的格式,指定为字符向量或由一个或多个转换设定符组成的字符串标量。fscanf 在读取文件时,会尝试将数据与 formatSpec 指定的格式进行匹配。

    数值字段

    下表列出了可用于数值输入的转换设定符。fscanf 将值转换为其十进制(以 10 为基数)的表示形式。

    数值字段类型转换设定符详细信息

    有符号整数

    %d

    以 10 为基数

    %i

    文件中的值确定相应基数:

    • 默认值以 10 为基数。

    • 如果初始数字为 0x0X,则值为十六进制(以 16 为基数)。

    • 如果初始数字为 0,则值为八进制(以 8 为基数)。

     

    %ld%li

    64 位值,以 10、8 或 16 为基数

    无符号整数

    %u

    以 10 为基数

    %o

    以 8 为基数(八进制)

    %x

    以 16 为基数(十六进制)

    %lu%lo%lx

    64 位值,以 10、8 或 16 为基数

    浮点数

    %f

    浮点字段可以包含下列任意项(不区分大小写):Inf-InfNaN-NaN

    %e

    %g

    字符字段

    下表列出了可用于字符输入的转换设定符。

    字符字段类型转换设定符说明

    字符向量或字符串标量

    %s

    读取所有字符,不包括空白。

    %c

    读取任何单个字符,包括空白。
    要一次读取多个字符,请指定字段宽度。

    模式匹配

    %[...]

    只读取方括号中的字符,直到遇到第一个不匹配的字符或空白。

    示例:%[mus]'summer ' 读作 'summ'

    如果 formatSpec 包含数值设定符和字符设定符的组合,则 fscanf 将每个字符转换为与其对等的数值。即使 format 显式跳过所有数值(例如,formatSpec'%*d %s'),也将进行此转换。

    可选运算符

    • 要忽略的字段和字符

      fscanf 按顺序读取文件中的所有数值和字符,除非您要求它忽略特定字段或字段中的某一部分。要跳过字段,请在百分比符号 (%) 后插入星号 (*)。例如,要跳过整数,请指定 %*d

    • 字段宽度

      要指定一次读取的最大位数或文本字符数,请在百分比符号后插入数字。例如,%10c 一次最多读取 10 个字符,包括空白。%4f 一次最多读取 4 位数,包括小数点。

    • 要忽略的字面文本

      fscanf 忽略追加到 formatSpec 转换设定符的指定文本。

      示例:Level%u'Level1' 读作 1

      示例:%uStep'2Step' 读作 2

    sizeA - 输出数组的维度
    Inf (默认) | 整数 | 二元素行向量

    输出数组 A 的维度,指定为 Inf、整数或一个二元素行向量。

    sizeA 输入的格式说明
    Inf读取到文件末尾。
    对于数值数据,输出 A 是一个列向量。
    对于文本数据,A 是一个字符向量。
    n最多读取 n 个数值或字符字段。
    对于数值数据,输出 A 是一个列向量。
    对于文本数据,A 是一个字符向量。
    [m,n]最多读取 m*n 个数值或字符字段。n 可以为 Inf,但 m 不可以。输出 A 是按列顺序填充的 m×n 数组。

     

    输出参数

    全部折叠

    A - 文件数据
    列向量 | 矩阵 | 字符向量 | 字符数组

    文件数据,以列向量、矩阵、字符向量或字符数组形式返回。A 的类和大小取决于 formatSpec 输入:

    • 如果 formatSpec 仅包含数值设定符,则 A 为数值。如果指定 sizeA 参数,则 A 是指定大小的矩阵。否则,A 为一个列向量。如果输入包含的值数少于 sizeA 个,则 fscanf 将使用零填充 A

      • 如果 formatSpec 仅包含 64 位有符号整数设定符,则 Aint64 类。

      • 如果 formatSpec 仅包含 64 位无符号整数设定符,则 Auint64 类。

      • 否则,Adouble 类。

    • 如果 formatSpec 仅包含字符或文本设定符(%c%s),则 A 为字符数组。如果指定 sizeA 并且输入包含比其少的字符,则 fscanf 使用 char(0) 填充 A

    • 如果 formatSpec 包含数值设定符和字符设定符的组合,则 Adouble 类的数值,fscanf 将每个文本字符转换为与其对等的数值。即使 formatSpec 显式跳过所有数值字段(例如,formatSpec'%*d %s'),也将发生此情况。

    • 如果 MATLAB® 无法将文件数据与 formatSpec 相匹配,则 A 可以是数值或字符数组。A 的类取决于 fscanf 在停止处理之前读取的值。

     

    count - 读取的字符数
    标量

    读取的字符数,以标量值形式返回。

    提示

    • 读取函数 sscanffscanf 的格式设定符不同于写入函数 sprintffprintf 的格式。读取函数不支持精度字段。宽度字段指定可写入的最小值和可读取的最大值。

    算法

    MATLAB 使用与文件相关联的编码方案读取字符。当使用 fopen 函数打开文件时,可以指定该编码。

    扩展功能

    C/C++ 代码生成
    使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

    另请参阅

    fgetl | fgets | fopen | fprintf | fread | sscanf | textscan

    主题

     

     

    展开全文
  • C语言fscanf()函数:输入函数(比较常用) 头文件: #include 定义函数: int fscanf(FILE * stream, const char *format, ...); 函数说明:fscanf()会自参数stream 的文件流中读取字符串, 再根据参数format 字符...
  • C-sources: #include int main() { FILE* fp; //定义一个文件 fp = fopen(p5.txt,r); if(fp == NULL) { printf(ERROR!... fscanf(fp,%d,&n); TwoPointSignal[k]=n; k++; } fclose(fp); for(j=0;
  • int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); 均可以接受变参,sscanf与scanf类似,可以将标准输入(stdin)作为输入源。最关键的部分,就是format...
  • 解释扫描 解释背后的魔力。
  • C++ fscanf函数分割读取文本文件

    千次阅读 2020-01-04 16:49:03
    C 库函数int fscanf(FILE *stream, const char *format, ...)从流 stream 读取格式化输入,头文件是<stdio.h>, fscanf遇到空格和换行时结束。 声明 下面是 fscanf() 函数的声明。 int fscanf(FILE *stream...

    描述

    C 库函数 int fscanf(FILE *stream, const char *format, ...) 从流 stream 读取格式化输入,头文件是<stdio.h>,  fscanf遇到空格和换行时结束。

    声明

    下面是 fscanf() 函数的声明。

    int fscanf(FILE *stream, const char *format, ...)

    参数

    • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
    • format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符
      format 说明符形式为 [=%[*][width][modifiers]type=],具体讲解如下:
    参数描述
    *这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。
    width这指定了在当前读取操作中读取的最大字符数。
    modifiers为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g)
    type一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。

    fscanf 类型说明符:

    类型合格的输入参数的类型
    c单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。char *
    d十进制整数:数字前面的 + 或 - 号是可选的。int *
    e,E,f,g,G浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4float *
    o八进制整数。int *
    s字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。char *
    u无符号的十进制整数。unsigned int *
    x,X十六进制整数。int *
    • 附加参数 -- 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

    返回值

    如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

    示例 

    现在有这样一个数据文件test.txt,想用fscanf函数读取

    //test.txt文件内容
    1,2,3
    4,5,6
    7,8,9
    # include <iostream>
    # include <stdio.h>
    
    int main(void)
    {
    FILE  *fq;
    int x[3], y[3], z[3];
     
    fq=fopen("test.txt" ,"r");
    for (int i=1; i<=3; i++)
    {
        fscanf(fq,"%lf ,%lf ,%lf\n",&x[i], &y[i], &z[i]);//%lf之间应该有逗号,因为没有逗号只能读第一个数。用&是因为要把数存到对应数组元素的地址中去。\n是换行读取
    }
    fclose(fq);
    return 0;
    }
    

     

     

    展开全文
  • Matlab中fscanf函数使用

    2020-11-26 18:53:09
    fscanf读取文本文件中的数据。 一.语法 A = fscanf(fileID,formatSpec) A = fscanf(fileID,formatSpec,sizeA) [A,count] = fscanf(___) 1.输入参数 fileID-文件标识符 已打开文本文件的文件标识符,指定...

    目录

    一.语法

    1.输入参数

    2.输出参数

    二.说明

    三.示例

    1.将文件内容读取到列向量中

    2.将文件内容读取到数组中

    3.跳过文件中的特定字符


    fscanf读取文本文件中的数据。

    一.语法

    A = fscanf(fileID,formatSpec)
    
    A = fscanf(fileID,formatSpec,sizeA)
    
    [A,count] = fscanf(___)

    1.输入参数

    fileID - 文件标识符

    已打开文本文件的文件标识符,指定为整数。使用fscanf读取文件之前,必须使用fopen打开文件并获取fileID

    数据类型: double

    formatSpec - 数据字段的格式

    文件中数据字段的格式,指定为字符向量或由一个或多个转换设定符组成的字符串标量。fscanf在读取文件时,会尝试将数据与formatSpec指定的格式进行匹配。

    数值字段

    下表列出了可用于数值输入的转换设定符。fscanf 将值转换为其十进制(以 10 为基数)的表示形式。

    数值字段类型转换设定符详细信息

    有符号整数

    %d

    以 10 为基数

    %i

    文件中的值确定相应基数:

    • 默认值以 10 为基数。

    • 如果初始数字为 0x 或 0X,则值为十六进制(以 16 为基数)。

    • 如果初始数字为 0,则值为八进制(以 8 为基数)。

     

    %ld 或 %li

    64 位值,以 10、8 或 16 为基数

    无符号整数

    %u

    以 10 为基数

    %o

    以 8 为基数(八进制)

    %x

    以 16 为基数(十六进制)

    %lu%lo%lx

    64 位值,以 10、8 或 16 为基数

    浮点数

    %f

    浮点字段可以包含下列任意项(不区分大小写):Inf-InfNaN 或 -NaN

    %e

    %g

    字符字段

    下表列出了可用于字符输入的转换设定符。

    字符字段类型转换设定符说明

    字符向量或字符串标量

    %s

    读取所有字符,不包括空白。

    %c

    读取任何单个字符,包括空白。
    要一次读取多个字符,请指定字段宽度。

    模式匹配

    %[...]

    只读取方括号中的字符,直到遇到第一个不匹配的字符或空白。

    示例:%[mus] 将 'summer ' 读作 'summ'

    如果 formatSpec包含数值设定符和字符设定符的组合,则fscanf将每个字符转换为与其对等的数值。即使format显式跳过所有数值(例如,formatSpec 为 '%*d %s'),也将进行此转换。

    可选运算符

    • 要忽略的字段和字符

      fscanf按顺序读取文件中的所有数值和字符,除非要求它忽略特定字段或字段中的某一部分。要跳过字段,请在百分比符号 (%) 后插入星号 (*)。例如,要跳过整数,请指定 %*d

    • 字段宽度

      要指定一次读取的最大位数或文本字符数,请在百分比符号后插入数字。例如,%10c 一次最多读取 10 个字符,包括空白。%4f 一次最多读取4位数,包括小数点。

    • 要忽略的字面文本

      fscanf 忽略追加到 formatSpec 转换设定符的指定文本。

      例如:Level%u 将 'Level1' 读作 1

      例如:%uStep 将 '2Step' 读作 2

    sizeA - 输出数组的维度

    输出数组 A 的维度,指定为 Inf、整数或一个二元素行向量。

    sizeA 输入的格式说明
    Inf读取到文件末尾。
    对于数值数据,输出 A 是一个列向量。
    对于文本数据,A 是一个字符向量。
    n最多读取 n 个数值或字符字段。
    对于数值数据,输出 A 是一个列向量。
    对于文本数据,A 是一个字符向量。
    [m,n]最多读取 m*n 个数值或字符字段。n 可以为 Inf,但 m 不可以。输出 A 是按列顺序填充的 m×n 数组。

    2.输出参数

    A - 文件数据

    文件数据,以列向量、矩阵、字符向量或字符数组形式返回。A 的类和大小取决于 formatSpec 输入:

    • 如果 formatSpec 仅包含数值设定符,则 A 为数值。如果指定sizeA参数,则A是指定大小的矩阵。否则,A为一个列向量。如果输入包含的值数少于sizeA个,则fscanf将使用零填充 A

      • 如果 formatSpec 仅包含 64 位有符号整数设定符,则 A 为 int64 类。

      • 如果 formatSpec 仅包含 64 位无符号整数设定符,则 A 为 uint64 类。

      • 否则,A 为 double 类。

    • 如果 formatSpec 仅包含字符或文本设定符(%c 或 %s),则 A 为字符数组。如果指定 sizeA 并且输入包含比其少的字符,则 fscanf 使用 char(0) 填充 A

    • 如果 formatSpec 包含数值设定符和字符设定符的组合,则 A 是 double 类的数值,fscanf 将每个文本字符转换为与其对等的数值。即使 formatSpec 显式跳过所有数值字段(例如,formatSpec 是 '%*d %s'),也将发生此情况。

    • 如果MATLAB®无法将文件数据与 formatSpec相匹配,则 A 可以是数值或字符数组。A 的类取决于fscanf在停止处理之前读取的值。

    count - 读取的字符数

    读取的字符数,以标量值形式返回。

    注意:

    • 读取函数 sscanf 和 fscanf 的格式设定符不同于写入函数 sprintf 和 fprintf 的格式。读取函数不支持精度字段。宽度字段指定可写入的最小值和可读取的最大值。

    二.说明

    A = fscanf(fileID ,formatSpec) 将打开的文本文件中的数据读取到列向量 A 中,并根据 formatSpec 指定的格式解释文件中的值。fscanf 函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。

    如果 fscanf 无法将 formatSpec 与数据相匹配,将只读取匹配的部分并停止处理。该文本文件由文件标识符 fileID 指示。使用 fopen 打开文件,指定字符编码,以及获取 fileID 值。读取文件后,请调用 fclose(fileID) 来关闭文件。

    A = fscanf(fileID ,formatSpec,sizeA) 将文件数据读取到维度为 sizeA 的数组 A 中,并将文件指针定位到最后读取的值之后。fscanf 按列顺序填充 AsizeA 必须为正整数或采用 [m n] 的形式,其中 m 和 n 为正整数。

    [A,count] = fscanf(___) 还将返回 fscanf 读取到 A 中的字段数。对于数值数据,这是已读取的值数。可以将此语法与前面语法中的任何输入参数结合使用。

    三.示例

    1.将文件内容读取到列向量中

    创建一个包含浮点数的示例文本文件。如下所示:

    x = 100*rand(8,1);
    fileID = fopen('nums1.txt','w');
    fprintf(fileID,'%4.4f\n',x);
    fclose(fileID);

    查看文件的内容。如下所示:

    type nums1.txt
    81.4724
    90.5792
    12.6987
    91.3376
    63.2359
    9.7540
    27.8498
    54.6882

    打开要读取的文件并获取文件标识符 fileID。如下所示:

    fileID = fopen('nums1.txt','r');

    定义要读取的数据的格式。使用 '%f' 指定浮点数。如下所示:

    formatSpec = '%f';

    读取文件数据并按列顺序填充输出数组 Afscanf 在整个文件中重新应用格式 formatSpec。如下所示:

    A = fscanf(fileID,formatSpec)
    
    A = 8×1
    
       81.4724
       90.5792
       12.6987
       91.3376
       63.2359
        9.7540
       27.8498
       54.6882

    A 是一个包含该文件中的数据的列向量。关闭文件。如下所示:

    fclose(fileID);

    2.将文件内容读取到数组中

    创建一个包含整数和浮点数的示例文本文件。如下所示:

    x = 1:1:5;
    y = [x;rand(1,5)];
    fileID = fopen('nums2.txt','w');
    fprintf(fileID,'%d %4.4f\n',y);
    fclose(fileID);

    查看文件的内容。如下所示:

    type nums2.txt
    
    2 0.9058
    3 0.1270
    4 0.9134
    5 0.6324

    打开要读取的文件并获取文件标识符 fileID。如下所示:

    fileID = fopen('nums2.txt','r');

    定义要读取的数据的格式和输出数组的形状。如下所示:

    formatSpec = '%d %f';
    sizeA = [2 Inf];

    读取文件数据并按列顺序填充输出数组 Afscanf 在整个文件中重新使用格式 formatSpec。如下所示:

    A = fscanf(fileID,formatSpec,sizeA)
    
    A = 2×5
    
        1.0000    2.0000    3.0000    4.0000    5.0000
        0.8147    0.9058    0.1270    0.9134    0.6324

    关闭文件,如下所示:

    fclose(fileID);

    转置该数组,以便 A 与文件中数据的方向匹配。如下所示:

    A = A'
    
    A = 5×2
    
        1.0000    0.8147
        2.0000    0.9058
        3.0000    0.1270
        4.0000    0.9134
        5.0000    0.6324
    

    3.跳过文件中的特定字符

    跳过示例文件中的特定字符并仅返回数值数据。创建一个包含温度值的示例文本文件。

    str = '78°C 72°C 64°C 66°C 49°C';
    fileID = fopen('temperature.dat','w');
    fprintf(fileID,'%s',str);
    fclose(fileID);

    读取文件中的数字并跳过文本 °C。此外,还返回 fscanf。读取的值数。扩展的 ASCII 代码 176 表示度数符号。

    fileID = fopen('temperature.dat','r');
    degrees = char(176);
    [A,count] = fscanf(fileID, ['%d' degrees 'C'])
    fclose(fileID);
    
    A =
    
        78
        72
        64
        66
        49
    
    
    count =
    
         5

    A 是一个包含文件中的数值的向量。count 指示 fscanf 读取五个值。

     

     

    展开全文
  • C语言读取文件(二)——fscanf 详谈

    万次阅读 多人点赞 2019-06-13 21:58:20
    fscanf 函数用于格式化读入文件中数据,可以大大提高读取文件的效率。这次笔者将最近使用该函数的一些经验记录下来。 第一部分:问题和结论 fscanf 函数的原型是: int fscanf(FILE* stream, const char* format, ...

    原创: hxj7

    fscanf 函数用于格式化读入文件中数据,可以大大提高读取文件的效率。这次笔者将最近使用该函数的一些经验记录下来。

    第一部分:问题和结论

    fscanf 函数原型是:

    int fscanf(FILE* stream, const char* format, [argument...]);
    

    fscanf 函数与 scanf 函数用法类似,只不过前者用于读取文件流的数据而已。至于 fscanf 的基础用法我就不赘述了,网上的文章很多。简单提及一下要点
    1. format str:如%d, %f, %c, %s等,分别表示读入一个整数,浮点数,字符,字符串。还可以加上控制,如%ld,表示读入一个长整型数,%20s表示最多读入20个字符。
    2. 返回值:在没有出错的情况下,fscanf 返回正确匹配和赋值的域的个数;如果出错,则返回EOF。

    fscanf难点在于以下几点:
    1. 对空白符的处理(空格、制表符、换行符);
    2. *的用法;
    3. [] 以及 [^] 的用法;
    4. EOF 的处理;

    对于上述问题,网上的文章都语焉不详,所以笔者自己写了点实验代码进行验证,应该是比较详细的小结了。
    先把结论罗列在下面,具体的实验代码放在文章最后:
    1. 在空白符这个意义上来讲,fscanf 对空格、制表符、换行符是一视同仁的,不加区分的;%s会跳过前面的空白符,但是不会跳过后面的空白符;%c不会跳过空白符。
    2. *表示读取一个域,但是不赋值给变量。
    3. []表示只读取中括号内的字符,[]表示不读取中括号内的字符,值得注意的是%[]s将不会跳过前面的空白符。
    4. 如果还没有任何一个域匹配成功或者任何一个匹配失败发生之前,就达到了文件流末尾,就算出错;或者读取文件流出错。这两种情况下,fscanf 返回EOF。

    第二部分:实验代码

    为了验证上面提出的一些问题,笔者动手写了下面的实验代码进行验证分析,代码共分为六个部分,注意每个部分所使用的文件内容是不一样的:
    1. fscanf 对空格的处理;
    2. fscanf 对制表符的处理;
    3. fscanf 对换行符的处理;
    4. 当空格、制表符以及换行符混杂时fscanf的处理;
    5. []符号在format str中的应用;
    6. 出错的情况。
    实验代码:(注意为了清晰无误地表示出不同的空白符,用 <\b>代表空格,<\t>表示制表符,<\n>表示换行符。)

          #include <stdio.h>
          #include <errno.h>
          
          void fscanfTest(FILE* fp) {
            char c1, c2, s1[100], s2[100];
            int d;
          
            // 第一部分:fscanf对空格的处理
            printf("the content of file is:\n");
            printf("hello<\\b>world<\\b><\\b>666lucky<\\n>");
            printf("\n\n");
          
            // %s不会跳过后面的空格
            fscanf(fp, "%s", s1);
            printf("%s!\n", s1);  // hello!
          
            // %s会跳过前面的一个空格
            rewind(fp);   // 将光标移回文件开头
            fscanf(fp, "%s%s", s2, s1);
            printf("%s! %s!\n", s2, s1);  // hello! world!
          
            // %*s会从文件流中读入,但是不会将值赋予变量(*的作用)
            rewind(fp);
            fscanf(fp, "%*s%s", s1);
            printf("%s!\n", s1);  // world!
          
            // %s会跳过前面的多个空格
            rewind(fp);
            fscanf(fp, "%*s%s%s", s2, s1);
            printf("%s! %s!\n", s2, s1);  // world! 666lucky!
          
            // %c不会跳过空格
            rewind(fp);
            fscanf(fp, "%*s%c", &c1);
            printf("%c!\n", c1); // " !"
          
            // format str中的一个空格表示如果文件流接下来有连续空格,都跳过
            rewind(fp);
            fscanf(fp, "%*s%*s %c", &c1);
            printf("%c!\n", c1);          // "6!"
            rewind(fp);
            fscanf(fp, "%*s%*s%*d%c", &c1);
            printf("%c!\n", c1);          // "l!" 
            rewind(fp);
            fscanf(fp, "%*s%*s%*d %c", &c2);   // 注意这里format str中的空格没起作用,是因为666和lucky之间没有空白符
            printf("%c!\n", c2);          // "l!"
            rewind(fp);
            fscanf(fp, "%*s%*s%*d%s", s1);
            printf("%s!\n", s1);          // "lucky!" 
            rewind(fp);
            fscanf(fp, "%*s%*s%*d %s", s2);
            printf("%s!\n", s2);          // "lucky!"
          
            // format str中的多个连续空格和一个空格的效果是一样的
            rewind(fp);
            fscanf(fp, "%*s %c", &c1);
            printf("%c!\n", c1); // "w!"
            rewind(fp);
            fscanf(fp, "%*s  %c", &c2);
            printf("%c!\n", c2); // "w!"
          
            // 第二部分:fscanf对制表符的处理
            printf("the content of file is:\n");
            printf("hello<\\t>world<\\t><\\t>666lucky<\\n>");
            printf("\n\n");
          
            // %s不会跳过后面的制表符
            fscanf(fp, "%s", s1);
            printf("%s!\n", s1);  // hello!
          
            // %s会跳过前面的一个制表符
            rewind(fp);
            fscanf(fp, "%s%s", s2, s1);
            printf("%s! %s!\n", s2, s1);  // hello! world!
          
            // %s会跳过前面的多个制表符
            rewind(fp);
            fscanf(fp, "%*s%s%s", s2, s1);
            printf("%s! %s!\n", s2, s1);  // world! 666lucky!
          
            // %c不会跳过制表符
            rewind(fp);
            fscanf(fp, "%*s%c", &c1);
            printf("%c!\n", c1); // "<\\t>!"
          
            // format str中的一个制表符表示如果文件流接下来有连续制表符,都跳过
            rewind(fp);
            fscanf(fp, "%*s%*s\t%c", &c1);
            printf("%c!\n", c1);          // "6!"
            rewind(fp);
            fscanf(fp, "%*s%*s%*d%c", &c1);
            printf("%c!\n", c1);          // "l!" 
            rewind(fp);
            fscanf(fp, "%*s%*s%*d\t%c", &c2);
            printf("%c!\n", c2);          // "l!"
            rewind(fp);
            fscanf(fp, "%*s%*s%*d%s", s1);
            printf("%s!\n", s1);          // "lucky!" 
            rewind(fp);
            fscanf(fp, "%*s%*s%*d\t%s", s2);
            printf("%s!\n", s2);          // "lucky!"
          
            // format str中的多个连续制表符和一个制表符的效果是一样的
            rewind(fp);
            fscanf(fp, "%*s\t%c", &c1);
            printf("%c!\n", c1); // "w!"
            rewind(fp);
            fscanf(fp, "%*s\t\t%c", &c2);
            printf("%c!\n", c2); // "w!"
          
            // 第三部分:fscanf对换行符的处理
            printf("the content of file is:\n");
            printf("hello<\\n>world<\\n><\\n>666lucky<\\n>");
            printf("\n\n");
          
            // %s不会跳过后面的换行符
            fscanf(fp, "%s", s1);
            printf("%s!\n", s1);  // hello!
          
            // %s会跳过前面的一个换行符
            rewind(fp);
            fscanf(fp, "%s%s", s2, s1);
            printf("%s! %s!\n", s2, s1);  // hello! world!
          
            // %s会跳过前面的多个换行符
            rewind(fp);
            fscanf(fp, "%*s%s%s", s2, s1);
            printf("%s! %s!\n", s2, s1);  // world! 666lucky!
          
            // %c不会跳过换行符
            rewind(fp);
            fscanf(fp, "%*s%c", &c1);
            printf("%c!\n", c1); // "<\\n>!"
          
            // format str中的一个换行符表示如果文件流接下来有连续换行符,都跳过
            rewind(fp);
            fscanf(fp, "%*s%*s\n%c", &c1);
            printf("%c!\n", c1);          // "6!"
            rewind(fp);
            fscanf(fp, "%*s%*s%*d%c", &c1);
            printf("%c!\n", c1);          // "l!" 
            rewind(fp);
            fscanf(fp, "%*s%*s%*d\n%c", &c2);
            printf("%c!\n", c2);          // "l!"
            rewind(fp);
            fscanf(fp, "%*s%*s%*d%s", s1);
            printf("%s!\n", s1);          // "lucky!" 
            rewind(fp);
            fscanf(fp, "%*s%*s%*d\n%s", s2);
            printf("%s!\n", s2);          // "lucky!"
          
            // format str中的多个连续换行符和一个换行符的效果是一样的
            rewind(fp);
            fscanf(fp, "%*s\n%c", &c1);
            printf("%c!\n", c1); // "w!"
            rewind(fp);
            fscanf(fp, "%*s\n\n%c", &c2);
            printf("%c!\n", c2); // "w!"
          
            // 第四部分:当空格、制表符以及换行符混杂时fscanf的处理
            printf("the content of file is:\n");
            printf("hello<\\b><\\t><\\n>world<\\t><\\b><\\n>666lucky<\\n>");
            printf("\n\n");
          
            // %s会跳过连在一起的空格、制表符和换行符
            fscanf(fp, "%s%s", s2, s1);
            printf("%s! %s!\n", s2, s1);  // hello! world!
          
            // 当作为空白符时,format str中的空格、制表符以及换行符是一样的,可以相互替代!
            rewind(fp);
            fscanf(fp, "%*s %c", &c1);
            printf("%c!\n", c1);  // "w!"
            rewind(fp);
            fscanf(fp, "%*s\t%c", &c2);
            printf("%c!\n", c2);  // "w!"
            rewind(fp);
            fscanf(fp, "%*s\n%c", &c1);
            printf("%c!\n", c1);  // "w!"
          
            // 第五部分:[]符号在format str中的应用
            printf("the content of file is:\n");
            printf("hello<\\b><\\t><\\n>world<\\b><\\t>666lucky<\\n>");
            printf("\n\n");
          
            // [el]表示只读取'e'或者'l'这个字符,[0-9]表示只读取0-9这10个数字字符
            // %[]之后的域都不起作用了,不会读取文件流。
            // test#1: %c%[]s可以正常工作
            // output#1: h! ell!
            errno = 0;
            d = fscanf(fp, "%c%[el]s", &c1, s1);
            if (d == 2) printf("%c! %s!\n", c1, s1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
            // test#2: %[]s后面的%c没有正常读取
            // output#2: d = 2
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%c%[el]s%c", &c2, s2, &c1);
            if (d == 3) printf("%c! %s! %c!\n", c2, s2, c1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
            // test#3: %[]s后面的%s没有正常读取
            // output#3: d = 2
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%c%[el]s%s", &c1, s1, s2);
            if (d == 3) printf("%c! %s! %s!\n", c1, s1, s2);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
            // test#4: 再次运行fscanf函数就可以继续读取文件流
            // output#4: o! world!
            errno = 0;
            d = fscanf(fp, "%c%s", &c2, s2);
            if (d == 2) printf("%c! %s!\n", c2, s2);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
          
            // [^el]表示不读取'e'也不读取'l'这个字符,[^0-9]表示不读取0-9的数字字符
            // %[^]之后的域都不起作用了,不会读取文件流。
            // test#5: %c%[^]s可以正常工作,注意下面的%[^w]s这个域读取了空格、制表符以及换行符。
            // output#5: h! ello<\\b><\\t><\\n>!
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%c%[^w]s", &c1, s1);
            if (d == 2) printf("%c! %s!\n", c1, s1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
            // test#6: %[^]s后面的%s没有正常读取
            // output#6: d = 2
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%c%[^w]s%s", &c2, s2, s1);
            if (d == 3) printf("%c! %s! %s!\n", c2, s2, s1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
            // test#7: 再次运行fscanf函数就可以继续读取文件流
            // output#7: w! orld!
            errno = 0;
            d = fscanf(fp, "%c%s", &c1, s1);
            if (d == 2) printf("%c! %s!\n", c1, s1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
            // test#8: %[^\n]s可以一直读取到行末尾,哪怕遇到空格或者制表符。
            // output#8: h! ello<\\b><\\t>!
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%c%[^\n]s", &c2, s2);
            if (d == 2) printf("%c! %s!\n", c2, s2);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
            // test#9: %[^ ]s不会读取空格,但是会读取制表符和换行符
            // output#9: <\\t><\\n>world!
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%*s%*c%[^ ]s", s1);
            if (d == 1) printf("%s!\n", s1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }  
            // test#10: %[^\t]s不会读取制表符,但是会读取空格和换行符
            // output#10: <\\n>world<\\b>!
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%*s%*c%*c%[^\t]s", s2);
            if (d == 1) printf("%s!\n", s2);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            } 
            // test#11: %[^]s不会跳过前面的空白符
            // output#11: <\\b><\\t><\\n>wo!
            errno = 0;
            rewind(fp);
            d = fscanf(fp, "%*s%[^r]s", s1);
            if (d == 1) printf("%s!\n", s1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
          
            // 第六部分:出错的情况
            // 从第五部分 test#2 以及 test#3 的例子中可以看出,fscanf的返回值表示能够正确赋值的域的个数。如果出错,fscanf返回EOF。
            // 怎样才算出错?如果还没有任何一个域匹配成功或者任何一个匹配失败发生之前,就达到了文件流末尾,就算出错;或者读取文件流出错。就这两种情况。
            // 即使所有域都不匹配,但只要没到达文件流末尾并且读取文件流过程中没有发生错误,就不算出错,errno就是0。此时,fscanf返回0。
            printf("the content of file is:\n");
            printf("hello");
            printf("\n\n");
          
            // test#1: 此时的%c发生匹配失败,所以返回值为0。
            // output#1: d = 0
            errno = 0;
            d = fscanf(fp, "%*s%c", &c1);
            if (d == 1) printf("%c!\n", c1);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }   
            // test#2: 继续读取,已经到达文件流末尾,返回EOF。
            // output#2: d = -1
            errno = 0;
            d = fscanf(fp, "%c", &c2);
            if (d == 1) printf("%c!\n", c2);
            else {
              printf("d = %d\n", d);
              if (errno != 0) perror("fscanf");
              else printf("Error: no matching characters!\n");
            }
          }
          
          int main(int argc, char* argv[]) {
            FILE *fp;
            if (argc < 2) {
              printf("Usage: %s <filename>\n", argv[0]);
              return 1;
            }
            if ((fp = fopen(argv[1], "r")) == NULL) {
              printf("Error: cannot open file\n");
              return 1;
            }
            fscanfTest(fp);
            fclose(fp);
            return 0;
          }
    

    (公众号:生信了)

    展开全文
  • fscanf类函数

    2015-03-04 14:47:58
    fscanf()函数(有点像正则表达式): 功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。
  • 一、fscanf 函数、 二、fprintf 函数
  • 对比一组函数的区别:一.scanf,fscanf和sscanf1.scanf2.fscanf3.sscanf二.printf,fprintf和sprintf1.printf2.fprintf3.sprintf 一.scanf,fscanf和sscanf 1.scanf 首先scanf我们的很熟悉,他就是从键盘上输入数据...
  • matlab中的fscanf的用法

    2012-05-09 13:14:52
    介绍matlab中的fscanf的用法,一目了然fscanf的语法格式
  • fscanf(fp,"%d",&var); fscanf_s(fp,"%d",&var,sizeof(int)); 区别:fscanf_s需要指定长度 scanf用法:scanf(控制字符,地址列表) 如:scanf("%d%s",&var,str); %d:整型 %ld:长整型 %s:字符串 %f:以...
  • 关于fscanf函数的使用

    2018-11-24 15:51:07
    我用fscanf读取文件里的数,读不出来。 代码如下 ``` #include #include int main() { FILE *fp; char ch, filename[100], a; int l=3,z=5; printf("输入文件名"); scanf("%s",filename); ...
  • if (fscanf_s(fp3, "Pattern = (cases = %d, n = %d, m = %d,)\n", &case_number, &n, &m) != 3) { cout不符合!!!"; } for (int current_case = 0; current_case ; current_case++) { ...
  • PHP fscanf

    2020-04-13 12:56:40
    PHP fscanf php从终端输入 <?php $stdin = fopen('php://stdin', 'r'); fscanf(STDIN, "%d\n", $n); fscanf(STDIN, "%d\n", $t); for ($i = 0; $i < $n; $i++) { ... fscanf(STDIN, "%[^\n...
  • fprintf()和fscanf()函数

    2015-09-20 11:14:36
    printf()和fscanf()函数
  • matlab fscanf

    2021-03-23 09:05:40
    name(i,:)=fscanf(fid,'%5c',1);% '%5c'表示读取字符的位数(5位)其他的不读取,1->表示读取的个数 year(i)= fscanf(fid,'%d',1); no1(i)=fscanf(fid,'%d',1); no2(i)=fscanf(fid,'%d',1);
  • III C 函数 fscanf 读取文件 ( 遇到空格换行结束) IV C 函数 fgets 读取文件 ( 遇到换行结束) V C 函数 fputc 写出单个字符 VI C 函数 fgetc 读取单个字符 VII C++ IO 流 VIII 文件操作代码示例

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,436
精华内容 12,174
关键字:

fscanf