4

行にいくつかの数字がある .txt ファイルから読み込もうとしています。

そのように見えます。

example.txt

123
456
789
555

これを読み取り用のバイナリ ファイルとして開きます。このファイルを 1 行ずつ読み取りたいので、すべての行に 4 文字 (3 つの数字と 1 つの改行文字 '\n') があることがわかります。

私はこれをやっています:

FILE * fp;

int page_size=4;
size_t read=0;
char * buffer = (char *)malloc((page_size+1)*sizeof(char));
fp = fopen("example.txt", "rb"); //open the file for binary input

//loop through the file reading a page at a time
do {
    read = fread(buffer,sizeof(char),page_size, fp); //issue the read call

    if(feof(fp)!=0) 
      read=0;

    if (read > 0) //if return value is > 0
    {   
        if (read < page_size) //if fewer bytes than requested were returned...
        {
            //fill the remainder of the buffer with zeroes
            memset(buffer + read, 0, page_size - read);
        }

        buffer[page_size]='\0';
        printf("|%s|\n",buffer);
    }

}
while(read == page_size); //end when a read returned fewer items

fclose(fp); //close the file

printf では、この結果が期待されます

|123
|
|456
|
|789
|
|555
|

しかし、私が取っている実際の結果は次のとおりです。

|123
|
456|
|
78|
|9
6|
|66
|

そのため、最初の 2 つの fread の後、2 つの数字のみを読み取り、改行文字で何かが完全に間違っているように見えます。

では、ここで fread の何が問題なのですか?

4

2 に答える 2

2

以下を使用して、ファイルを1行ずつ読み取ることができます。

   FILE * fp;
   char * line = NULL;
   size_t len = 0;
   ssize_t read;

   while ((read = getline(&line, &len, fp)) != -1) {
       printf("Line length: %zd :\n", read);
       printf("Line text: %s", line);
   }
于 2013-03-15T09:34:29.907 に答える
1
FILE * fp;
int page_size=4;
size_t read=0;
char * buffer = (char *)malloc((page_size+1)*sizeof(char));
fp = fopen("example.txt", "rb"); //open the file for binary input

//loop through the file reading a page at a time
do
{
read = fread(buffer,sizeof(char),page_size, fp); //issue the read call

if (read > 0) //if return value is > 0
{
    buffer[page_size]='\0';
    printf("|%s|\n",buffer);
}

}
while(read == page_size); //end when a read returned fewer items

fclose(fp);

このコードで試すことができます。このコードは正常に動作しています。

あなたのコードを試してみましたが、私のシステムでも問題なく動作しています。

于 2013-03-15T09:53:04.000 に答える