首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用fread和fread逐行读取

用fread和fread逐行读取
EN

Stack Overflow用户
提问于 2020-11-07 04:06:12
回答 1查看 1.6K关注 0票数 2

我试着逐行读取一个.txt文件,其中每一行都有19个字符长,这是我的代码(我只想使用fread和fread来正确理解指针):

代码语言:javascript
复制
int main(int argc, char *argv[]){
    FILE *file = fopen(argv[1], "r");
    if(file == NULL){
        perror("fopen");
        return 0;
    }
    int i = 0;
    int j = 0;
    char L[20];
    while(1){
        if(feof(file)){
            break;
        }
        fseek(file, i*20, SEEK_SET);
        fread(L,19,sizeof(char),file);
        printf("%s\n", L);
        i++;
        }
    fclose(file);
    return 0;   
 }

我认为这应该发生的是,我将指向文件的指针移动到循环中每一行的开头,然后移动一行,等等。源文件.txt是:

代码语言:javascript
复制
123456789:123456789
perro:guau         
gato:miau          
                   
vaca:muuu          
                   
lobo:auuu          

虽然我从程序中得到的输出是:

代码语言:javascript
复制
123456789:123456789�V
perro:guau         �V
gato:miau          �V
                   �V
vaca:muuu          �V
                   �V
lobo:auuu          �V
                   �V
                   �V

我试着改变20年代和19年代,因为我不知道我是否以正确的方式包括字符串的结尾,但是结果更糟,任何帮助都会被接受。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-07 05:12:03

  • OP的代码具有未定义的行为(UB),因为"%s"需要字符串。然而,L[]缺乏空字符。若要打印字符数组,请使用"%.*s"

feof().

  • 检查fread()返回值,而不是fread()

  • 使用fread()的返回值来知道读取了多少。

fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);

  • 审查参数顺序

示例:

代码语言:javascript
复制
size_t sz = sizeof L / sizeof L[0];
size_t n;
while((n = fread(L,sizeof L[0], sz, file)) > 0) {
  printf("<%.*s>\n", (int) n, L);
  i++;
  fseek(file, i*20, SEEK_SET);
}

fread()不是最好的读取行的工具。研究fgets()

“每一行都有19个字符长,”--> C将一行定义为“每一行由零个或多个字符加上一个终止的新行字符组成。”从C角度来看,您的行包含一个新行,因此总共有20个字符.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64724313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档