C 扫描文件中的字符串

C 扫描文件中的字符串,c,string,file,C,String,File,例如,我有一个包含以下数据的文件: 22 John Sm1th 3.14 我想将22存储到int,John Sm1th存储到字符串,3.14存储到浮点 int main() { int n; char str[51]; float f; FILE *fp; fp=fopen("aaa.txt"); fscanf(fp, "%d", &n); fflush(stdin); fgets(str, ***, fp);

例如,我有一个包含以下数据的文件:

22 John Sm1th 3.14
我想将
22
存储到
int
John Sm1th
存储到字符串,
3.14
存储到
浮点

int main()
{
    int n;
    char str[51];
    float f;

    FILE *fp;
    fp=fopen("aaa.txt");

    fscanf(fp, "%d", &n);
    fflush(stdin);
    fgets(str, ***, fp);
    fflush(stdin);
    fscanf(fp, "%d", &f);

    fclose(fp);
    system("PAUSE");
    return 0;
}
在f
gets()
调用中,我如何知道输入***的号码?我无法真正使用
strlen()
sizeof()
获取大小,因为字符串尚未读取

fgets(str, sizeof(str), fp);
fgets
读取的字符数最多比第二个参数指定的字符数少一个,因此可以为其提供缓冲区的大小,而不是最终读取的字符串的大小

例如,您读取大小为20的行,然后
fgets
读取20个字符并遇到新行,它会停止并将该行存储在缓冲区中。如果读取的行大小为60,则
fgets
最多读取50(
sizeof(str)-1
),并将数据存储在缓冲区中



顺便说一句,
fflush(stdin)
在标准C中是未定义的行为,但某些实现可能支持它。

由于要读取的字符串中有一个数字,因此不能真正使用设置的
scanf
格式,也不能使用
fgets
,因为您事先不知道内部字符串的长度


最好的办法可能是阅读整行,然后在空格上标记(例如)。获取第一个和最后一个令牌,并将其转换为数字,同时获取所有中间令牌并将它们连接成单个字符串。

fflush(stdin)
如果平台是Windows,则定义该字符串;它在(大多数)其他平台上是未定义的。@JonathanLeffler是的,我不清楚,修正了。我记得,它也是在Linux中定义的。嗯……很有趣。Linux确实定义了它(对于输入流,fflush()丢弃从底层文件中提取的、但应用程序尚未使用的任何缓冲数据)。这是一个合理、甚至有用的定义(与Microsoft的定义相匹配)。顺便说一下,如果您想使用
scanf
读取
float
变量,您应该使用
%f
格式说明符。