質問
次の機能があります。
void writeResults(FILE* fp, FILE* fpw, Vector w, int size) {
Vector x;
while (1) {
char line[MAX_DIMENSION]; //max dimension is 200
if( (fgets(line,MAX_DIMENSION,fp)) == NULL) { //EOF
return;
}
else {
int i=0;
while (line[i]!='\0') {
printf("% d %c\n",i,line[i]); //print to check it
i++;
}
}
}
}
読み取るファイルの行は次のとおりです。
1,1
2,2
ただし、各charを「 0」まで印刷すると、この出力を取得します。
0 1
1 ,
2 1
3
4
0 2
1 ,
2 2
3
4
余分な3枚と4文字を読む理由について誰かが手がかりを持っていますか? (ファイルに余分なスペースはありません)。
注:ファイルは次の方法で開かれました。
FILE* fp = fopen(fileIn, "r");
if (fp == NULL) {
perror("Couldn't open File");
exit(errno);
}
解決
キャリッジリターン、ラインフィード - 窓の上に?
ファイルを開く方法を知っていれば役立ちます。テキストファイルとして開いた場合、2つの追加の文字を表示しないでください。1つはNewline用です。ただし、バイナリファイルとして開くと、CRとLFの両方を実際に読み取る必要があります。
コメントに示されているように、Linuxを使用している場合は、より多くの診断ツールが利用可能です。おそらく、最初から最も簡単なのはod -c file
';これにより、ファイルにあるものが正確に表示されます。ファイルがWindowsボックス上にあった場合でも、CRLFラインのエンディングがある可能性があることに注意してください。 「VIM」を使用すると、ファイルタイプが「[dos]」であることがわかります。
または、文字を整数(および文字)として印刷することもできます。
printf("%d (%2d) %c\n", i, line[i], line[i]);
「1」の場合は49、「2」の場合は50、 'for' 'for' '、' for newline(lf、 'for 10が表示されます。\n
')、そして何か他のもの - それは謎です(ただし、CRで13を表示します)。
Crはです \r
Cソースのキャラクター。プリントヘッドがラインの開始に戻る必要があることを示すために使用されました(プリンターキャリッジはラインの開始に戻りました)。 LFまたはラインフィードは、紙の上に紙をスクロールしました。 WindowsとMS-DOSはどちらもCRLF(Curr-Liff)シーケンスを使用して、行の終了を示します。 Unixは常にLF、別名NewlineまたはNLのみを使用しています。 MacOS 9以前はCRだけを使用しました。
他のヒント
%C、印刷%Dを印刷しないと、文字ASCIIコードが表示されます。キャラクターはキャリッジリターンとラインフィードであることがわかります。 13および10
あなたの入力ファイルには含まれていると思います -
1,1
[SPACESPACE]
2,2
[SPACESPACE]
したがって、初めてfgetsは次のように読みます -
line{'1',',','1','',''}
そして2回目は読みます
line{'2',',','2','',''}
だから、あなたはあなたが指定したように出力を取得しています