2

ファイルの行数と文字数を数えるコードを書いています。

#include <fstream>
#include <iostream>
#include <stdlib.h>    
using namespace std;


int main(int argc, char* argv[])
    {
    ifstream read(argv[1]);


    char line[256];
    int nLines=0, nChars=0, nTotalChars=0;
    read.getline(line, 256);

    while(read.good())                      /
        {
        nChars=0;

        int i=0;
        while(line[i]!='\n')
            {

            if ((int)line[i]>32) {nChars++;}
            i++;
            }

        nLines++;
        nTotalChars= nTotalChars + nChars;
        read.getline(line, 256);
        }
    cout << "The number of lines is "<< nLines << endl;
    cout << "The number of characters is "<< nTotalChars << endl;
    }

while(line[i]!='\n')は次のエラーの原因のようです

セグメンテーション違反 (コアダンプ)

何が悪いのかわかりません。インターネットは、私が知る限り、行末を正しくチェックしていると教えてくれます。

4

5 に答える 5

6

'\n'入力シーケンスから破棄されるため、コードは見つかりません。のドキュメントからgetline:

区切り文字は改行文字 [...] です。入力シーケンスで見つかった場合、入力シーケンスから抽出されますが、破棄され、s には書き込まれません。

あなたが探しているはずです'\0'

    while(line[i])
        {
        if ((int)line[i]>32) {nChars++;}
        i++;
        }
于 2013-08-08T12:26:58.810 に答える
1

getlineは保存されないため\n、ループ:

    while(line[i]!='\n')
        {

        if ((int)line[i]>32) {nChars++;}
        i++;
        }

line[i]配列の長さを超えてセグメンテーション違反が発生するまで、決して終了しません。

于 2013-08-08T12:28:17.817 に答える
1

行に行末文字がありません。したがって、行末ではなく NULL 文字 (文字列の終わり) をチェックする必要があります。また、バッファのサイズ (256) を超えないようにしてください。

于 2013-08-08T12:28:29.213 に答える
0

コードにはいくつかの問題がありますが、まず、行をchar[]. を使用する std::stringと、部分的な行の読み取りなどについて心配する必要はありません。

次に、ファイルからをgetline抽出しますが、保存しないという事実があります。そのため、コード ( を使用するように変更されていても) はバッファ内に決して表示されません。文字列を使用している場合は、からを繰り返します 。を使用している場合は、 の呼び出しの後に呼び出されるによって返されるバイト数を反復します。(世界中のテキスト ファイル.'\n'std::string'\n'line.begin()line.end()char[]read.gcount()getlinechar[] '\0'

最後に、最後の行が a で終わらない'\n'場合 (Windows ではよくあるケース)、それを処理しません。を使用している場合は std::string、次のように簡単に記述できます。

std::getline( read, line );
while ( read ) {
    //  ...
    std::getline( read, line );
}

あるいは:

while ( std::getline( read, line ) ) {
    ++ nLines;
    for ( std::string::const_iterator current = line.begin();
            current != line.end();
            ++ current ) {
        //  process character *current in line...
    }
}

(後者は醜いものですが、どこにでもあります。)

では、これchar[]を次のように置き換える必要があります。

while ( read.getline( buffer, sizeof(buffer) ) || read.gcount() != 0 ) {
    int l = read.gcount();
    if ( read ) {
        ++ nLines;
    } else {
        if ( read.eof() ) {
            ++ nLines;  //  Last line did not end with a '\n'
        } else {
            read.clear();   //  Line longer than buffer...
    }
    for ( int i = 0; i != l; ++ i ) {
        //  process character buffer[i] in line...
    }
}

最後の質問: どういう(int)line[i] > 32意味ですか? 欲しかった!isspace( line[i] ) && !iscntrl( line[i] )?(もちろん、それはまったくそうではありません。)

于 2013-08-08T14:28:31.270 に答える