Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言读取文本文件_C_Scanf - Fatal编程技术网

用C语言读取文本文件

用C语言读取文本文件,c,scanf,C,Scanf,真是个小问题。阅读包含X个单词的文本文件,并将每个单词逐个添加到链接列表中,最好的方法是什么。i、 这只青蛙老了 因此,Frog、Is和Old将分别放在一个ListNode中,全部从一个文件读取 如果fscanf是最好的选择,我真的想知道与fscanf结合使用的最佳功能。所有的建议都很好 干杯 编辑: 我的问题是,如果我想解析一个大的文本文件,是否最好将每个单词逐个fscanf成一个数组,添加到列表,释放数组,然后重复?或者是否有更有效的方法将%s转换说明符匹配非空白字符 #define QUO

真是个小问题。阅读包含X个单词的文本文件,并将每个单词逐个添加到链接列表中,最好的方法是什么。i、 这只青蛙老了

因此,Frog、Is和Old将分别放在一个ListNode中,全部从一个文件读取

如果fscanf是最好的选择,我真的想知道与fscanf结合使用的最佳功能。所有的建议都很好

干杯

编辑:
我的问题是,如果我想解析一个大的文本文件,是否最好将每个单词逐个fscanf成一个数组,添加到列表,释放数组,然后重复?或者是否有更有效的方法

将%s转换说明符匹配非空白字符

#define QUOTE(s) #s
#define STR(s) QUOTE(s)

#ifndef BUFSIZE
#  define BUFSIZE 255
#endif

char buf[BUFSIZE+1];
while (fscanf(fin, "%" STR(BUFSIZE) "s", buf)) {
    /* buf holds next word. Todo:
       + allocate space for word
       + copy word to newly allocated space
       + add to linked list
     */
}
或者,可以使用标记化将字符串拆分为子字符串,使用一组字符作为指定的字符数组。您的系统也可能有strep,它旨在取代strtok。strtok和strep都会修改传入的数组,因此请注意这不会导致访问数据的代码的其他部分出现问题。strep不是线程安全的;如果有多个线程访问要分析的字符串,请使用strep或strtok\r

由于第二个示例一次从文件中读取一行以供strtok_r处理,因此如果文件的任何一行长度超过BUFSIZE-1个字符,并且一行中的BUFSIZE-1st和BUFSIZEth字符都是字母,则第二个示例会将字一分为二。一个解决方案是创建一个缓冲字符串流,这样当到达缓冲区的末尾时,缓冲区中剩余的任何内容都会移到前面,并且缓冲区的其余部分会被文件中的更多数据填充,只是要小心比缓冲区长的字;在生产代码中,它是一个潜在的安全漏洞,可能导致拒绝服务攻击

上述所有函数的一个问题是它们不处理输入中的空字符。如果希望解析可能包含空字符的数据,则需要使用非标准函数,其中包括编写自己的函数


至于效率,您使用的任何算法都需要从复杂度较高的文件中读取,并且需要I/O,从而降低程序速度并分配内存来存储单词。无论您使用fscanf、strtok还是其他方法,时间和空间复杂度都不会有太大变化;唯一可能的问题是分配了多少中间缓冲区。要找到最有效的实现,最好尝试两种方法并分析它们。

%s转换说明符将匹配非空白字符

#define QUOTE(s) #s
#define STR(s) QUOTE(s)

#ifndef BUFSIZE
#  define BUFSIZE 255
#endif

char buf[BUFSIZE+1];
while (fscanf(fin, "%" STR(BUFSIZE) "s", buf)) {
    /* buf holds next word. Todo:
       + allocate space for word
       + copy word to newly allocated space
       + add to linked list
     */
}
或者,可以使用标记化将字符串拆分为子字符串,使用一组字符作为指定的字符数组。您的系统也可能有strep,它旨在取代strtok。strtok和strep都会修改传入的数组,因此请注意这不会导致访问数据的代码的其他部分出现问题。strep不是线程安全的;如果有多个线程访问要分析的字符串,请使用strep或strtok\r

由于第二个示例一次从文件中读取一行以供strtok_r处理,因此如果文件的任何一行长度超过BUFSIZE-1个字符,并且一行中的BUFSIZE-1st和BUFSIZEth字符都是字母,则第二个示例会将字一分为二。一个解决方案是创建一个缓冲字符串流,这样当到达缓冲区的末尾时,缓冲区中剩余的任何内容都会移到前面,并且缓冲区的其余部分会被文件中的更多数据填充,只是要小心比缓冲区长的字;在生产代码中,它是一个潜在的安全漏洞,可能导致拒绝服务攻击

上述所有函数的一个问题是它们不处理输入中的空字符。如果希望解析可能包含空字符的数据,则需要使用非标准函数,其中包括编写自己的函数


至于效率,您使用的任何算法都需要从复杂度较高的文件中读取,并且需要I/O,从而降低程序速度并分配内存来存储单词。无论您使用fscanf、strtok还是其他方法,时间和空间复杂度都不会有太大变化;唯一可能的问题是分配了多少中间缓冲区。要找到最有效的实现方法,最好的办法是尝试几种方法并对它们进行分析。

在找到一种效率不够的方法之前,不应该寻找更有效的方法


但是像strtok这样的东西可能适合你的需要,而不需要太多的马洛西。它可以让你在适当的位置切割绳子。小心使用

在你找到一种效率不够的方法之前,你不应该寻找一种更有效的方法

但是像strtok这样的东西可能适合你的需要,而不需要太多的马洛西。它可以让你在适当的位置切割绳子。小心使用

> 如果你想在现代台式电脑上寻找高速。。。你可以使用多线程

一个线程填充一个字符缓冲区,比如4Ko,并且只执行此操作 一个线程读取缓冲区,解析单词并将它们添加到列表中 如果您不需要整个列表,那么一个线程可以执行列表中您想执行的任何操作
这个想法是,进程在等待I/O时不会休眠。如果有很多CPU内核,为了提高速度,将文件切成大块,一个内核进程一块。很多复杂代码和bug的机会,但是,嘿,速度并不便宜…

如果你想在现代台式计算机上实现高速。。。你可以使用多线程

一个线程填充一个字符缓冲区,比如4Ko,并且只执行此操作 一个线程读取缓冲区,解析单词并将它们添加到列表中 如果您不需要整个列表,那么一个线程可以执行列表中您想执行的任何操作
这个想法是,进程在等待I/O时不会休眠。如果有很多CPU内核,为了提高速度,将文件切成大块,一个内核进程一块。出现复杂代码和bug的机会很多,但是,嘿,速度并不便宜…

您尝试过使用fscanf吗?如果是这样,您是否遇到了任何问题?我的问题是,如果我想解析一个大型文本文件,是否最好将每个单词逐个fscanf到一个数组中,添加到列表中,释放数组,然后重复?或者有没有一种更有效的方法,正如下面的回答所说,strtok通过就地解析字符串来避免mallocing。但是,如果您决定使用scanf,请确保指定最大缓冲区长度,即%20s而不是%s。list add函数是复制数据还是直接存储数据?考虑选择A。这样做的一个好处是,其他人可以使用,您将收到一个通知,说明有人在评论中对您进行了回复。另请参见,您是否尝试使用fscanf?如果是这样,您是否遇到了任何问题?我的问题是,如果我想解析一个大型文本文件,是否最好将每个单词逐个fscanf到一个数组中,添加到列表中,释放数组,然后重复?或者有没有一种更有效的方法,正如下面的回答所说,strtok通过就地解析字符串来避免mallocing。但是,如果您决定使用scanf,请确保指定最大缓冲区长度,即%20s而不是%s。list add函数是复制数据还是直接存储数据?考虑选择A。这样做的一个好处是,其他人可以使用,你会收到一个通知,有人在评论中向你发表了讲话。另请参见,+1更多事实,更少说教。我在写我的时没有看到你的。+1更多的事实,更少的说教。我写我的时没看到你的。