【问题标题】:Reading line by line using fread and fseek使用 fread 和 fseek 逐行读取
【发布时间】:2021-02-19 18:13:24
【问题描述】:

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

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文件是:

123456789:123456789
perro:guau         
gato:miau          
                   
vaca:muuu          
                   
lobo:auuu          
                   

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

123456789:123456789�V
perro:guau         �V
gato:miau          �V
                   �V
vaca:muuu          �V
                   �V
lobo:auuu          �V
                   �V
                   �V

我尝试更改 20s 和 19s,因为我不知道我是否以正确的方式包含字符串字符的结尾,但得到了更糟糕的结果,我们将不胜感激。

【问题讨论】:

  • 在将 L 视为字符串之前,您在哪里确保它是 0 终止符?
  • char L[20] = {0}; 可能会有所帮助。
  • 我认为你的意思是 L[19]。索引是从零开始的。
  • 检查fread()返回值,而不是feof()
  • 如果您正在阅读一行 19 个字符 - 您在每行末尾的 '\n' 做什么?或者这包括在你的总数中吗?根据"123456789:123456789" 它不是...(指针和fread() 不是相关概念)

标签: c string file fread fseek


【解决方案1】:
  • OP 的代码有未定义的行为,(UB) 因为"%s" 需要一个字符串。然而L[] 缺少空字符。要打印字符数组,请使用"%.*s"

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

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

  • 查看fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); 的参数顺序

示例:

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 将 line 定义为“每行由零个或多个字符加上一个终止换行符组成。”从 C 的角度来看,您的 包含一个换行符,因此总共有 20 个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多