1

GNU/Linux では、次のファイル 'foo.csv' を使用します (もちろん、\rは Mac のキャリッジ リターンです):

0,1,2,3\r
4,5,6,7\r
6,9,10,11\r

fgets関数は、ファイル全体を 1 行として返します。fgetsが \r を newline として処理するように指定するにはどうすればよいですか?

C コードの例:

#include <stdio.h>

int main(int argc, char **argv) {
        FILE *stream = fopen(argv[1],"r");
        char tmp[1024];
        int i=0;
        while (fgets (tmp, 1024, stream) != NULL) {
                printf("line %d\n", i);
                i++;
        }
}

\r => \nを変換するパスを避けたいと思います。

4

2 に答える 2

2

たぶんgetdelim、このページで説明されているように使用してください: http ://www.gnu.org/software/libc/manual/html_node/Line-Input.html

getdelim(およびgetline)はfgetsとは動作が異なるため、コードを少し変更する必要があることに注意してください。特に、achar *ptr = NULLsize = 0;で始める必要があります。次に、それらをgetdelim(&ptr, &size, '\r', stream);-として渡し、ファイル全体の読み取りが終了したら、を呼び出しますfree(ptr);

編集:ファイルの末尾の行を確認するには:

int lineending(FILE *f)
{
    int ch;
    long fpos = ftell(f);
    while((ch = fgetc(f)) != EOF)
        if (ch == '\r' || ch == '\n')
            break;
    fseek(f, fpos, CUR_BEGIN);
    return ch;
}

どうぞ。

于 2012-12-26T15:00:11.650 に答える
1

Linux と OSX の両方でgetdelim、区切り文字を指定できる を呼び出すことができます。

于 2012-12-26T14:56:54.430 に答える