0

ファイル dog.txt があるとします

The
quick
brown
fox
jumps
over
the
lazy
dog

このような行を印刷できます

#include <stdio.h>
int 
main (void)
{
  char buf[10];
  FILE *fp = fopen ("dog.txt", "r");
  while (fgets (buf, sizeof buf, fp))
    printf ("%s", buf);
  return 0;
}

\0しかし、各「行」が改行 ( ) ではなくヌル文字 ( ) で区切られていたらどう\nでしょうか? 各「行」をどのように印刷しますか?

4

3 に答える 3

0

これは、 WhozCraig の 削除された回答の縮小版です。

入力ファイルから stdout にデータをダンプし、埋め込まれたヌル文字 (0) を改行に置き換えることだけが必要な場合は、それを実行します。先読みバッファリングなどは、この問題を単純化するために正直やりすぎです。さらに、fopen/fread/etc.. ファミリはすでにバッファリングしています。

注:これはOPが指定したものを正確に想定しています。それ以外の場合、これは通常の「テキスト」ファイルであり、埋め込まれたヌル文字(0)は出力ストリームで改行として扱われるべきです。

#include <stdio.h>
#include <errno.h>

int main(int argc, char* argv[])
{
    FILE *fp = NULL;        
    fp = fopen(argv[1], "rb");        
    do
    {   // pull next char, break on EOF, subst '\n' on 0.
        int ch = fgetc(fp);
        if (EOF == ch)
            break;
        if (0 == ch)
            ch = '\n';
        fputc(ch, stdout);
    } while (true);

    fclose(fp);
    return EXIT_SUCCESS;
}
于 2013-05-18T06:55:39.027 に答える
0

ファイルがテキスト ファイルでない場合 (つまり、印刷できない ASCII 文字が含まれている場合) は、バイナリとして扱います。

一度に「行」を読み取るのではなく (これはテキスト ファイルの概念です)、一度にバッファーを読み取ります (たとえば、一度に 1024 文字)。

ファイルが使用する行区切り文字 (たとえば、質問の「null」文字) に遭遇しない限り、一度に 1 つずつ読み取った各文字を出力します。その文字に遭遇すると、代わりに改行を出力します。

「b」フラグを含めることにより、バイナリモードでファイルを開きます。

FILE *fp = fopen("dog.txt", "rb");

freadを使用して、一度に 1 つのバッファーでデータを読み取ります。

n = fread(buffer, sizeof(char), BUFFER_SIZE, source);
于 2012-10-29T01:32:35.507 に答える
0

「テキスト」ファイル処理とその他のファイル処理の違いは、「テキスト」関数が特定のことを前提としていることです (たとえば、\n はセパレータです)。そうでない場合は、明らかに「テキスト」操作関数を使用できません。あなたはそうしfread、コンテンツを自分で解析します。

于 2012-10-29T01:33:05.053 に答える