2017-08-15 16 views
2

は私がループの中でそれを読んでいるこのループ終了条件は

"input" 
height : 227 
width : 227 
depth : 3 

"conv" 
num_output : 96 
pad : 0 
kernel_size : 11 
stride : 4 
group : 1 

"relu" 

"pool" 
kernel_size : 3 
stride : 2 

のようなテキストファイルを持って動作しません(これは部分的なコードです)

char line[100]; 

while ((fgets(line, sizeof(line), filePtr))) { 
    if (line[0] != "\n") { 
     sscanf(line, "%15s : %15s", tmpstr1, tmpstr2); 
     printf("%s\n", tmpstr2); 
     printf("line = %s", line); 
    } else 
     break; 
} 

しかし、私は観察しましたif条件が常に成り立つと私はとの比較を試みている

"input" 
227 
line = height : 227 
227 
line = width : 227 
3 
line = depth : 3 
3 
line = 
3 
line = "conv" 
96 
line = num_output : 96 
0 
line = pad : 0 
11 
line = kernel_size : 11 
4 
line = stride : 4 
1 
line = group : 1 
1 
line = 
1 
line = "relu" 
1 
line = 
1 
line = "pool" 
3 
line = kernel_size : 3 
2 
line = stride : 2 

以下のように出力されていることでも結果は変わらない。私が間違っているところを私に指摘してください。

P.S. :gcc 5.2.1でUbuntu 16.04 64ビットマシンを使用しています。

+6

'ラインを[0] = "\ n" は、' - >! 'line [0]!= '\ n'' – BLUEPIXY

+3

' char'と文字列リテラルを比較しているので、コンパイラの警告を有効にする必要があります。 'gcc' -pedantic -Werror –

+1

@BLUEPIXYそれを指摘してくれてありがとう。そのtypoを完全に見落としました。 –

答えて

5

改行は文字、文字列ではありませんので、この変更:コンパイラの警告(GCCで-Wallフラグ)を有効にして、あなたが表示されるはずです

line[0] != '\n' 

:これまで

line[0] != "\n" 

をこのようなもの:

warning: comparison between pointer and integer 
warning: comparison with string literal results in unspecified behavior [-Waddress] 
4

文字列リテラルをcharと比較しようとしています。

付:

if(line[0] != '\n') 

それはうまく動作します。

テキストモードで開いているファイル(stdinを含む)を読み込んでいる場合は、下位システムが行末を示すために使用する表現はすべて、単一の '\ n'文字に変換されます。

コンパイラの警告を有効にする必要があります。 gccについては、-pedantic-Werrorです。

+0

良い答えですが、フラグのための私の答えをチェックする(私は1つのフラグを使用して警告を得た)。 – gsamaras

+0

はい、あなたはそれを残すので、OPには 'gcc'のためのより多くの機会があることがわかります:-) –

+0

あなたは早かったので、あなたはそれにふさわしいと答えました。 –

0

this siteで、fgetsはstr(あなたの場合の行)の値を変更しないことがわかります。値が変わらないので、ifテストは評価されたままになります。

fgetsがファイルの終わりを検出したかどうかを確認するには、fgetsがNULLを返したかどうかをチェックする必要があります。

0

文字を文字列と比較しています。line[0] != "\n"は、警告を生成します。空行を検出するために、代わりにこれを使用する:あなたもsscanf()の戻り値を確認する必要があり

line[0] != '\n' 

注:

char line[100]; 

while (fgets(line, sizeof(line), filePtr) && *line != '\n') { 
    if (sscanf(line, "%15s : %15s", tmpstr1, tmpstr2) == 2) { 
     printf("%s\n", tmpstr2); 
     printf("line = %s", line); 
    } else { 
     printf("invalid format: %s", line); 
    } 
} 
関連する問題