0

txt ファイルから読み取る C プログラムがあります。テキスト ファイルには、1 行に 1 語ずつ、単語のリストが含まれています。私がやりたいのは、テキスト ファイルから単語を取得し、それらを 1 つの文/段落として出力することですが、それらを印刷しようとすると、1 行に 1 つの単語が出力されます。ファイルから単語を読み取るときに、単語を2次元のchar配列に保存しています。私が考えているのは、配列がtxtファイルから改行文字をコピーしていることです。それは正しいですか? もしそうなら、改行文字なしで単語を配列に追加するにはどうすればよいですか?

    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

4 に答える 4

1

fgets 関数は、読み取り中のバッファーに改行文字 \n を含めます。\n と \r を除くすべての文字をコピーするには、ループ内に条件ステートメントを含めるだけです。何かのようなもの:

if ( line[j] != '\n' && line[j] != '\r' ) {
    /* Copy the character in your new buffer */
}
于 2012-10-08T22:10:57.513 に答える
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);
}
于 2012-10-08T22:13:17.227 に答える
1

for ループを次のように変更するだけです。

for(j = 0; j < 20 && line[j] != '\n';j++)
{            
    message[k][j]= line[j];
}
if(j < 20)
    message[k][j] = '\0';
于 2012-10-08T22:13:41.250 に答える
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 にコピーされる文字列に含まれます」と記載されているため、最後の文字をチェックしています。したがって、改行が存在する場合、それは最後の文字になります。

于 2012-10-08T22:13:57.060 に答える