[英]How can I read a specific line from a file, in C?
好吧:所以我有一个文件,我必须使用它来做。 过度简化,文件具有以下格式:
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,我有一个数组名[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”个名称,将每个名称分配给数组中的一个元素(名字= name [0],姓= name [n-1]) ?
我建议调查文件结尾。
while(!eof(fd))
{
...code...
}
请注意,我的C语言知识很生锈,但这应该可以帮助您入门。
IIRC eof返回值(-1),这就是为什么您需要将其与某些值进行比较的原因。 这里fd是您正在读取的文件的文件描述符。 然后,在解析文本或行数之后,您将得到“ n”。
编辑:既然我显然更累了,那么我想(没注意到您的'n'在顶部)。
读取第一行malloc中的'n'大小数组,以循环访问名称。
由于给定的格式似乎暗示名称的数量n
作为文件中的第一个条目给出,因此从stdin读取时可以使用OP描述的读取方式。 使用fscanf
从文件( n
)中读取第一个整数,然后使用malloc
为名称分配数组,然后使用直到n
的for
循环读取名称。
但是,我不确定示例数据的含义是否遵循do x⁽¹⁾, y⁽¹⁾ and z⁽¹⁾
格式。 也许我不理解问题的一部分。 如果这意味着可能有n
名称,则可以使用realloc
增加数组的大小。 增长阵列的一种常见方法是每次将长度加倍。
在这里,您可以开始学习。我将编译和调试作为学生的练习。
想法是如果文件总是很小,则将整个文件包含到单个数组中。 这比scanf()更有效。
char buf[100000], *bp, *N[1000]; // plenty big memset( buf, '\0', sizeof buf ); if ( fgets( buf, sizeof(buf), fd ) ) { int n = 0; char *bp; if ( buf[(sizeof buf)-2)] != '\0' ) { // file too long for buffer printf( stderr, "trouble: file too large: %d\n", (int)(sizeof buf)); exit(EXIT_FAILURE); } // now replace each \n with a \0, remembering where each line is. for ( bp = buf, bp = strchr( bp, '\n' ); bp++ ) N[n++] = bp; }
如果要读取任何大小的文件,则需要以块的形式读取文件,在读取之前对每个块进行calloc(),并仔细处理当前缓冲区末尾的行片段,以将它们移至下一个缓冲区,然后正确继续阅读。 除非您对可以读取的行数有限制,否则可能还需要以块的形式设置N,但是这次remalloc()可能是您的朋友。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.