fread 不读取多行

Posted

技术标签:

【中文标题】fread 不读取多行【英文标题】:fread doesn't read multiple lines 【发布时间】:2013-03-03 22:32:11 【问题描述】:

我正在尝试从行中有一些数字的 .txt 文件中读取数据。

看起来是这样的。

example.txt

123
456
789
555

我将其作为二进制文件打开以进行读取,我想逐行读取此文件,所以我知道每行有 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 有什么问题呢?

【问题讨论】:

你的代码在我的系统(linux)上完成了预期的事情 如果你在 windows 上,你的 example.txt 可能不是 4,而是每行 5 个字符,因为在 windows 上,行分隔符是 \r\n,而不仅仅是 \n。跨度> 对您读取的字符串进行十六进制转储。提示:Dos 换行。 顺便说一句,为什么不使用调试器并检查 buffer 中的内容? windows:windows 中的行尾由两个字符组成,当您以文本模式打开文件时,您只会得到一个字符,即\n,如果您以二进制模式打开,则会得到两个字符\r\n . 【参考方案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);

你可以试试这段代码,这段代码运行良好。

我尝试了您的代码,并且在我的系统上也运行良好。

【讨论】:

它看起来像我的简化版。那么问题是我使用了每行末尾有两个字符(\r\n)的windows文本文件。所以现在是的,它可以工作了【参考方案2】:

您可以使用以下内容逐行读取文件。

   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);
   

【讨论】:

我不想在每种情况下都逐行读取文件。我只想每次读取 4 字节(页面大小),在这种情况下会出现问题

以上是关于fread 不读取多行的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中fread()读出的数据怎么和原来不一致了?

fread()函数第一次读取成功,但第二次读取失败,为啥为啥为啥,

php fread()函数读取文本直到文件尾却无法结束

fread函数无法正确读取数据

matlab fread读取.dat文件 怎么办啊?急死!

使用包 data.table 中的 fread 一次读取块