使用fscanf在2列中获取2个字符串

时间:2014-07-22 01:01:57

标签: c file-io scanf

我试图让我的程序读取一个包含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   

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

无法正常工作

"%s"扫描空白文字。 "该计划是"和"左括号"嵌入了空白区域。

需要一次读取一行,然后将该行解析为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 :(得分:0)

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

  • 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。)