用c语言从文件中读取字符串

用c语言从文件中读取字符串,c,string,file,C,String,File,我有这样一个输入文件: 1 2 2 Medium 1 2 0 Medium 2 1 0 Medium 2 0 2 Medium int x,y,z; char cs[20]; fscanf(fp3,"%d",&x); fscanf(fp3,"%d",&y); fscanf(fp3,"%d",&z); fscanf(fp3,"%19s",cs); 我正在使用fscanf()读取整数值,这很好。有人知道如何读入字符串并将其放入字符串变量吗 int x,y,z;

我有这样一个输入文件:

1 2 2 Medium 
1 2 0 Medium
2 1 0 Medium
2 0 2 Medium
int x,y,z; 
char cs[20];
fscanf(fp3,"%d",&x); 
fscanf(fp3,"%d",&y); 
fscanf(fp3,"%d",&z); 
fscanf(fp3,"%19s",cs);
我正在使用fscanf()读取整数值,这很好。有人知道如何读入字符串并将其放入字符串变量吗

int x,y,z; 
char* cs; 
fscanf(fp3,"%d",&x); 
fscanf(fp3,"%d",&y); 
fscanf(fp3,"%d",&z); 
fscanf(fp3,"%s",&cs);

您需要已分配的空间来存储字符串。试着这样做:

1 2 2 Medium 
1 2 0 Medium
2 1 0 Medium
2 0 2 Medium
int x,y,z; 
char cs[20];
fscanf(fp3,"%d",&x); 
fscanf(fp3,"%d",&y); 
fscanf(fp3,"%d",&z); 
fscanf(fp3,"%19s",cs);
您还可以一次扫描所有值:

fscanf(fp3,"%d %d %d %19s", &x, &y, &z, cs);

注意:始终在scanf模式中使用
%s
,以防止缓冲区溢出。

您需要已分配的空间来存储字符串。试着这样做:

1 2 2 Medium 
1 2 0 Medium
2 1 0 Medium
2 0 2 Medium
int x,y,z; 
char cs[20];
fscanf(fp3,"%d",&x); 
fscanf(fp3,"%d",&y); 
fscanf(fp3,"%d",&z); 
fscanf(fp3,"%19s",cs);
您还可以一次扫描所有值:

fscanf(fp3,"%d %d %d %19s", &x, &y, &z, cs);
注意:始终在扫描模式中使用
%s
,以防止缓冲区溢出。

  • 使用one格式字符串时,效果会更好
  • 你应该使用循环
  • 下面是一些代码:

    int a,b,c;
    char str[256];
    while(fscanf(fd, "%d %d %d %s ", &a, &b, &c, str) == 4){
        //get some coffee
    }
    
    这是一个标准的文件循环,而不是结束循环。另外,
    str
    不需要
    &
    ,因为它已经是一个指针,不需要像
    a
    b
    c
    那样被引用。格式字符串末尾的空格位于
    %s
    之后,表示一旦读取了一个空格,它将停止。这样一来,它就不会包含在字符串
    str

    中,可以说:

  • 使用one格式字符串时,效果会更好
  • 你应该使用循环
  • 下面是一些代码:

    int a,b,c;
    char str[256];
    while(fscanf(fd, "%d %d %d %s ", &a, &b, &c, str) == 4){
        //get some coffee
    }
    

    这是一个标准的文件循环,而不是结束循环。另外,
    str
    不需要
    &
    ,因为它已经是一个指针,不需要像
    a
    b
    c
    那样被引用。格式字符串末尾的空格位于
    %s
    之后,表示一旦读取了一个空格,它将停止。这样,它就不会包含在字符串
    str

    中,请注意两件事:

    • 您需要保留一个缓冲区以将字符串复制到其中
    • 也永远不要使用普通的“%s”扫描模式。这应该被禁止。而是插入缓冲区的长度,在
      %
      s
      之间减去1。例如,8字节缓冲区的“%7s”

      • 注意两件事:

        • 您需要保留一个缓冲区以将字符串复制到其中
        • 也永远不要使用普通的“%s”扫描模式。这应该被禁止。而是插入缓冲区的长度,在
          %
          s
          之间减去1。例如,8字节缓冲区的“%7s”


        如果您一开始没有将其读入“字符串变量”中,我会有点担心。是否与%s相同?并使用char*。为什么不发布您正在使用的fscanf函数调用的代码段呢?int x,y,z;char*cs;fscanf(fp3、%d、&x);fscanf(fp3、%d、&y);fscanf(fp3、%d、&z);fscanf(fp3、%s、&cs);扫描字符串不起作用。我遇到运行时错误。如果您没有首先将其读入“字符串变量”,我会有点担心。是否与%s相同?并使用char*。为什么不发布您正在使用的fscanf函数调用的代码段呢?int x,y,z;char*cs;fscanf(fp3、%d、&x);fscanf(fp3、%d、&y);fscanf(fp3、%d、&z);fscanf(fp3、%s、&cs);扫描字符串不起作用。我收到运行时错误。我认为“cs”不应该与&,它是一个数组。正在使用。虽然你必须在字符数组上做一些指针巫术。例如,使用
        &cs[0]
        而不是
        cs
        。字符*的普通字符串可以。所以:
        strcmp(str1,&cs[0])注意,您应该测试来自fscanf的返回值。如果不是4,则某些转换失败或到达文件结尾。您可以在一条指令中读取输入(我更喜欢它):
        if(fscanf(fp3,“%d%d%d%s”,&x,&y,&z,cs)!=4)/*错误*我不认为“cs”应该与&,它是一个数组。正在使用。虽然你必须在字符数组上做一些指针巫术。例如,使用
        &cs[0]
        而不是
        cs
        。字符*的普通字符串可以。所以:
        strcmp(str1,&cs[0])注意,您应该测试来自fscanf的返回值。如果不是4,则某些转换失败或到达文件结尾。您可以在一条指令中读取输入(我更喜欢它):
        if(fscanf(fp3,“%d%d%d%s”,&x,&y,&z,cs)!=4)/*错误*这是未定义的行为<代码>str
        未初始化且不指向任何地方。这就是OP获得未处理异常的原因。更好地测试转换次数,而不是
        EOF
        修复了我的答案,也运行它。您可以用
        str
        替换
        &str[0]
        ,是的,只需使用
        str
        运行即可。我不确定C是否关心数组指针和普通指针<代码>str
        未初始化且不指向任何地方。这就是OP获得未处理异常的原因。更好地测试转换次数,而不是
        EOF
        修复了我的答案,也运行它。您可以用
        str
        替换
        &str[0]
        ,是的,只需使用
        str
        运行即可。我不确定C是否关心数组指针和普通指针。