如何让我的C程序从文件中读取多行文本?

时间:2017-11-20 03:16:48

标签: c file loops text lines

我正在尝试编写一个程序,从输入文件中读取文本行,重新排列单词中的字母,然后将它们写入输出文件。到目前为止,我有这个:

void processFile(FILE* ifp, FILE* ofp) {
char line[1024];
char word[1024];
char* lineptr = line;
char temp;
printf("Begin file processing\n");
while (fgets(line, BIGLINE, ifp) != NULL){

    while(sscanf(lineptr,"%s",word) == true)
    {
        if (strlen(word) >= 4){
            temp = word[1];
            word[1] = word[2];
            word[2] = temp;
        }
        fputs(word,stdout);
        fputs(word,ofp);
        fputs(" ",stdout);
        fputs(" ", ofp);
        lineptr += strlen(word) + 1;

    }

}/*while*/
printf("End file processing\n");} /* processFile */

现在输出文件显示为:

<rpe><div calss="text_to_html">Project Gtuenberg The Avdentures of Sehrlock Hlomes, by Atrhur Cnoan Dyole 

但我需要它来阅读我的测试文件中的所有行

<pre><div class="text_to_html">Project Gutenberg The Adventures of Sherlock Holmes, by Arthur Conan Doyle

 This eBook is for the use of anyone anywhere at no cost and with
 almost no restrictions whatsoever.  You may copy it, give it away or
 re-use it under the terms of the Project Gutenberg License included
 with this eBook or online at <a href="http://www.gutenberg.net" 
 class="_blanktarget">www.gutenberg.net</a>
 </div></pre>

我还需要确保如果我将任何文本文件作为输入文件,它将读取所有行而不是第一行。我怎么能用我已经拥有的东西做到这一点?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,您的主要问题是在启动内部循环之前需要在lineptr循环内重置while (fgets(…) != NULL)。如果您放置所有变量以使其具有最小可能范围,则您不太可能遇到此问题 - 因此temp应在if块内定义,而word并且应在外环和内环之间定义lineptr。你处理的第一行是最长的一行,你有点不幸;这意味着lineptr指向空字节。

您应该在sizeof(line)的通话中使用BIGLINE而不是fgets()。计数为true的{​​{1}}的使用也不合适(虽然在技术上不正确)。

这些变化产生:

1

#include <stdio.h> #include <string.h> static void processFile(FILE *ifp, FILE *ofp) { char line[1024]; printf("Begin file processing\n"); while (fgets(line, sizeof(line), ifp) != NULL) { char word[1024]; char *lineptr = line; while (sscanf(lineptr, "%s", word) == 1) { if (strlen(word) >= 4) { char temp = word[1]; word[1] = word[2]; word[2] = temp; } fputs(word, stdout); fputs(word, ofp); fputs(" ", stdout); fputs(" ", ofp); lineptr += strlen(word) + 1; } putchar('\n'); } printf("End file processing\n"); } int main(void) { processFile(stdin, stderr); return 0; } 编译成rf79.c并运行标准错误重定向到rf79时,我得到输出:

/dev/null

这看起来像你想要的。