我有一个文本文件,第一行如下:
j0W82LBrSdUbw
基本上它可以有很多空格,水平标签开头然后一些字符有数字或字母(宽度为14个字符 - 固定),然后可能会有一些空格或标签。整行的宽度是未知的,我的意思是它可以有任意数量的空格或制表符。我想忽略前导和尾随空格,但只将字母/数字转换为字符串。
我尝试使用带有字符类的fscanf读取它,如下所示(我尝试了几种方法但没有成功),但结果不正确,它不是读取和忽略空间,也不读取实际字母。出于测试目的,我将整行长度固定为54个字符(空格,数字字符全部包括在内)
fscanf(fin,"%54*[ ]%[^ ]%*[ ]",s);//s is char array char s[100];
和
fscanf(fin,"%54[^ \t]",s);
1]当行宽度固定且已知为54个字符时,如何使用fscanf解析此问题。
2]当线宽是未知且可变的时候?
3]我在哪里可以阅读关于在scanf / fscanf中使用字符类的好文档?
答案 0 :(得分:1)
在循环中尝试fgetc()
。您可能需要添加错误检查和处理边界情况。
char s[15];
size_t sndx = 0;
int ch;
while (((ch = fgetc(fin)) != '\n') && (ch != EOF) && (sndx < 15)) {
if (sndx || !isspace((unsigned char)ch)) {
s[sndx++] = ch;
}
}
s[sndx] = 0;
/* discard rest of line */
while (((ch = fgetc(fin)) != '\n') && (ch != EOF)) /* void */;
答案 1 :(得分:1)
您无法在此处使用[...]
构造。它匹配非空字符序列。
只需使用简单的"%s"
格式,它会自动忽略空白字符。为了增加安全性,请使用"%14s"
,以便无效的输入字符串不会降低缓冲区的速度。