0

私は次の機能を持っています:

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

ただし、「\ 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);
}
4

3 に答える 3

2

%c を出力せずに %d を出力すると、ASCII コードの文字が表示されます。文字はキャリッジ リターンとライン フィードです。13と10

http://www.asciitable.com/を参照

于 2010-08-21T21:33:42.033 に答える
1

キャリッジ リターン、ライン フィード - Windows では?

ファイルを開いた方法がわかれば助かります。テキスト ファイルとして開いた場合、2 つの余分な文字は表示されないはずです。1 つは改行用です。ただし、バイナリ ファイルとして開くと、実際には CR と LF の両方が読み取られるはずです。

コメントに示されているように、Linux を使用している場合は、さらに多くの診断ツールを利用できます。おそらく、最も簡単に開始できるのは ' od -c file' です。これにより、ファイルの内容が正確に表示されます。ファイルが Windows ボックスにあった場合でも、CRLF 行末が含まれている可能性があることに注意してください。「vim」を使用すると、ファイルの種類が「[dos]」であると表示される場合があります。

または、文字を整数 (および文字) として出力することもできます。

printf("%d (%2d) %c\n", i, line[i], line[i]);

「1」の場合は 49、「2」の場合は 50、「,」の場合は 44、改行 (LF、「\n」) の場合は 10、その他にも何かが表示されるはずです。これは謎です (ただし、CR の場合は 13 と表示されます)。


CR は\rC ソースの文字です。これは、印刷ヘッドが行の先頭に戻る必要があることを示すために使用されました (プリンター キャリッジが行の先頭に戻ります)。LF または改行により、用紙が 1 行上にスクロールされました。Windows と MS-DOS はどちらも CRLF (curr-liff) シーケンスを使用して行の終わりを示します。Unix は常に LF、改行または NL のみを使用していました。MacOS 9 以前は CR のみを使用していました。

于 2010-08-21T21:28:20.593 に答える
1

入力ファイルには次が含まれていると思います-

1,1
[SPACESPACE]
2,2
[SPACESPACE]

初めてのfgetsは次のように読み取られます-

line{'1',',','1','',''}

そして二度目の読み取り

line{'2',',','2','',''}

そのため、指定したとおりに出力が得られます

于 2010-08-21T21:36:24.427 に答える