【问题标题】:Using fscanf to get 2 string in 2 columns使用 fscanf 在 2 列中获取 2 个字符串
【发布时间】:2014-07-22 01:01:56
【问题描述】:

我正在尝试让我的程序读取一个包含 2 列的文件,并且第一列包含一些字符串,我无法将其存储到数组中

这是我的代码:

fp2=fopen("Symbol Table.txt","r");char str[100];
while(fscanf(fp2,"%s %s",str,stemp[scnt])!=NULL) {
    puts(stemp[scnt++]);getch();    //This is just here to display conents of second col
}
fclose(fp2)

这是我的 txt 文件:

void                                                          void                                                          
main                                                          Main                                                          
(                                                             Left Parenthesis                                              
)                                                             Right Parenthesis                                             
{                                                             Left Brace                                                    
S                                                             Identifier                                                    
:                                                             Colon                                                        
$%                                                            Start of Block Comment                                        
This program is a simple calculatorFuctions:ADD,SUB,MULT,DIV  String                                                        
%$                                                            End of Block Comment                                          
Unsigned                                                      Noise Words                                                   
int                                                           Integer   

存储长字符串的代码在进入数组之前被分割

【问题讨论】:

  • 你需要使用while(fscanf(fp2,"%s %s",str,stemp[scnt])==2)
  • 它仍然是相同的,其中的放入与之前相同的长字符串的某些部分仍存储在第二列数组中:(
  • 试试while(fscanf(fp2,"%s %[^\n]", str, stemp[scnt])==2) {

标签: c file-io scanf


【解决方案1】:

当您尝试使用scanffscanf 读取字符串时,它会读取字符串,直到遇到空格、制表符或换行符。在这种情况下,如我所见,在第一个循环中,strstemp 将被分配给“void”和“void”,在第二个循环中,它将是“main”和“Main”在第三个循环中,"(" 和 "Left" 等等。

您需要使用特殊字符(如制表符 (\t) 字符)将两列与多个字符串分开,以便知道第一列何时结束并使用 getc 函数而不是 scanf 读取,直到您到达您的行中的那个特殊字符,然后将所有字符(即字母)组合成一个字符串。您可以采用相同的方法使用getc 函数读取第二列,直到遇到换行符(\n)。

【讨论】:

    【解决方案2】:

    while(fscanf(fp2,"%s %s",str,stemp[scnt])!=NULL) {

    不会工作

    "%s" 扫描空白文本。 “This program is”和“Left Parenthesis”嵌入了空格。

    需要一次读取一行,然后将该行解析为 2 列的 2 个字符串。

    char buf[100];
    if (fgets(buf, sizeof buf, fp2) == NULL) Handle_EOForIOError();
    
    column[2][100];
    size_t len = strlen(buf);
    if (len < 62) Handle_ShortLine();
    buf[61] =  = '\0'; // cut the line in 2
    
    column[0][0] = '\0';  // In case column is all white-space
    sscanf(buf, " %[^\n]", column[0]);
    column[1][0] = '\0';
    sscanf(&buf[62], " %[^\n]", column[1]);
    

    【讨论】:

      【解决方案3】:

      其他答案包含不正确的陈述。其实,

      • fscanf 并不总是只读取空白字符之前的字符串。转换说明符 [ 还读取一个字符串,并包含预期字符集。

      • 您不需要用特殊字符分隔两列,因为两列的宽度已知为 62。

      • 您不需要一次读取一行然后解析它;不过,这可能会更容易。

      所以,如果你更喜欢fscanf,你可以使用

          while (fscanf(fp2, "%62[^\n]%[^\n]\n", str, stemp[scnt]) == 2)
      

      (您与NULL 的比较是错误的,因为NULL 是一个指针常量,而fscanf 不返回指针,而是返回分配的输入项数或EOF)。

      没有fscanf的版本:

          while (fgets(str, 62+1, fp2) && fgets(stemp[scnt], 62+1, fp2) && getc(fp2))
      

      getc 读取为\n。)

      【讨论】:

        【解决方案4】:

        while(fscanf(fp2,"%s %s",str,stemp[scnt])!=NULL) 的本质是只读取由空格分隔的两个字符串。如果您的文本文件包含这样的长字符串

        This program is a simple calculatorFuctions:ADD,SUB,MULT,DIV
        

        在获取时,它会将这些字符串分成%s %s 的部分并获取。因此,请按以下方式更改您的文本文件并尝试:

        void                                                          void                                                          
        main                                                          Main                 
        (                                                             LeftParenthesis         
        )                                                             RightParenthesis   
        {                                                             LeftBrace   
        S                                                             Identifier         
        :                                                             Colon           
        $%                                                            StartofBlockComment   
        ThisProgramIsASimpleCalculatorFuctions:ADD,SUB,MULT,DIV       String 
        %$                                                            EndofBlockComment 
        Unsigned                                                      NoiseWords   
        int                                                           Integer   
        

        【讨论】:

          猜你喜欢
          • 2016-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-09
          • 2011-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多