2

好吧:所以我有一个文件,我必须处理它。过度简化,该文件具有以下格式:

n
first name
second name
...
nth name
random name
do x⁽¹⁾, y⁽¹⁾ and z⁽¹⁾
random name
do x⁽²⁾, y⁽²⁾, z⁽²⁾
...
random name
do x⁽ⁿ⁾, y⁽ⁿ⁾, z⁽ⁿ⁾

所以,实际的细节并不重要。问题是:我必须声明一个变量 n,我有一个数组 name[MAX],我将用名称填充这个数组,从 name[0] 到 name[n-1]。

好吧,问题是:如果我以前不知道我有多少个名字,我怎么能得到这个输入?

例如,如果这是来自键盘的用户输入,我可以做得很好:我会这样做:

int n; char name[MAX];
scanf( "%d", &n);
int i; for (i = 0; i < n; i++)
    scanf( "%s", &N[i]);

我可以继续,做整个代码,但你明白了。但是,我的输入现在来自一个文件。我不知道如何获取输入,我所能做的就是 fscanf() 整个文件,但由于我不知道它的大小(第一个数字将确定它),所以我不能这样做。据我所知(如果这不是真的,请纠正我,我对此很陌生),我们不能使用命令“for”并逐渐获取数字,就好像它来自键盘一样,对吧?

所以,我看到的唯一出口是找到一种从文件中读取特定行的方法。如果我能做到这一点,剩下的就很容易了。问题是,我该怎么做?我用谷歌搜索了它,我什至在那里发现了一些问题,尽管它根本没有任何意义。显然,从文件中读取特定行非常复杂。

这是来自初学者的问题集,所以我怀疑它是否复杂。我一定错过了一些非常简单的东西,虽然我只是不知道它是什么。

所以,问题是:例如,你会怎么做?

如何扫描文件中的第一个数字 n,然后扫描其他“n”个名称,将每个名称分配给数组中的一个元素(名字 = 名称 [0],姓氏 = 名称 [n - 1]) ?

4

3 回答 3

1

我建议调查文件结束。

while(!eof(fd))
{
...code...
}

请注意,我的 C 知识已生疏,但这应该可以帮助您入门。

IIRC eof 返回一个值(-1),这就是为什么您需要将其与某物进行比较的原因。这里 fd 是您正在阅读的文件的文件描述符。然后在解析文本或行数之后,你就有了'n'。

编辑:因为我显然比我想的更累(没有注意到顶部的'n')。
读取第一行 malloc for 'n' size array for loop 以迭代名称。

于 2013-02-27T01:48:19.843 回答
0

由于给定的格式似乎暗示名称的数量n作为文件中的第一个条目给出,因此可以使用 OP 在从标准输入读取时描述的读取方式。用于fscanf从文件 ( n) 中读取第一个整数,然后用于malloc为名称分配数组,然后使用for循环 up ton来读取名称。

但是,我不确定do x⁽¹⁾, y⁽¹⁾ and z⁽¹⁾格式后面的示例数据的含义。也许我不理解问题的一部分。如果这意味着可能有多个n名称,那么您可以使用realloc来增加数组的大小。一种常见的增加数组的方法是每次将长度加倍。

于 2013-02-27T01:45:46.903 回答
0

给你..我将编译和调试作为学生的练习。

如果你的文件总是很小,这个想法是把整个文件放入一个数组中。这比 scanf() 高效得多。

字符缓冲区[100000],*bp,*N[1000];// 很大

memset( buf, '\0', sizeof buf );
if ( fgets( buf, sizeof(buf), fd ) )
{
    诠释 n = 0;
    字符 *bp;
    如果 ( buf[(sizeof buf)-2)] != '\0' )
    { // 文件对于缓冲区来说太长了
        printf(stderr, "问题: 文件太大: %d\n", (int)(sizeof buf));
        退出(EXIT_FAILURE);
    }
    // 现在用 \0 替换每个 \n,记住每一行的位置。
    for ( bp = buf, bp = strchr( bp, '\n' ); bp++ )
        N[n++] = bp;
}

如果要读取任何大小的文件,则需要以块的形式读取文件,在读取之前对每个块进行 calloc() 处理,并仔细处理留在当前缓冲区末尾的行片段以将它们移动到下一个缓冲区和然后正确地继续阅读。除非您对可以读取的行数有限制,否则 N 可能还需要分块设置,但这次 remalloc() 可能是您的朋友。

于 2013-02-27T01:59:04.687 回答