坚持使用C文件i / o

时间:2012-10-08 22:06:13

标签: c file io

我有一个从txt文件中读取的C程序。文本文件包含单词列表,每行一个单词。我想要做的是从文本文件中获取单词并将其打印为一个句子/段落,但是,当我尝试打印它们时,它们仍然每行打印一个单词。  当我从文件中读取它时,我将这些单词存储在2d char数组中。我认为发生的是数组从txt文件复制换行符,这是正确的吗?如果是这样,如何在没有新行char的情况下将单词添加到数组中?

    while(fgets(line,20,lineRead)!=NULL)
    {
        for(j = 0; j < 20;j++)
        {            
            message[k][j]= line[j];

        }
        printf("%s", message[k]);
    }

我尝试了几次while循环但没有成功:

while(line[j] != ' ')        
while(line[j] != NULL)       
while(line[j] != EOF)      
while(line[j] != ' \')

我正在学习C所以请在我的错误中具体说明。我想了解我做错了什么,而不只是得到答案。

谢谢!

4 个答案:

答案 0 :(得分:1)

fgets函数包括您正在阅读的缓冲区中的换行符\ n。只需在循环中包含一个条件语句即可复制除\ n和\ r \ n之外的所有字符。类似的东西:

if ( line[j] != '\n' && line[j] != '\r' ) {
    /* Copy the character in your new buffer */
}

答案 1 :(得分:1)

换行符是字符串的一部分,您需要删除它们:

#include <string.h>

while(fgets(line,20,lineRead)!=NULL)
{
    char* newline_pos = strpbrk (line, "\n\r"); // get first occurance of newline or carriage return
    if (newline_pos) 
         *newline_pos = '\0';

    printf("%s ", line);
}

答案 2 :(得分:1)

您只需将for循环更改为:

for(j = 0; j < 20 && line[j] != '\n';j++)
{            
    message[k][j]= line[j];
}
if(j < 20)
    message[k][j] = '\0';

答案 3 :(得分:0)

你应该这样做:

while(fgets(line,20,lineRead)!=NULL)
    {        
        strcpy(message[k], line);
        if(message[k][strlen(line)-1] == '\n')
            message[k][strlen(line)-1] = '\0']
        printf("%s", message[k]);
    }

这样做是将line复制到message[k]中,然后删除最后一个字符(如果是换行符)。我们正在检查最后一个字符,因为文档说“新行字符会使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。”因此,如果存在换行符,则它将是最后一个字符。