我试图让我的程序读取一个包含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
代码存储长字符串在进入数组之前被分割
答案 0 :(得分:0)
当您尝试使用scanf
或fscanf
读取字符串时,它会读取字符串,直到遇到空格,制表符或换行符。在这种情况下,正如我所看到的,在第一个循环中,str
和stemp
将被分配给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
。)