c - 在C中逐行读取每个字符

标签 c

我正在寻找一种关于如何从 txt 文件中逐行读取字符的解决方案,我找到了一个解决方案,但我没有得到代码的某些部分。就是这样:

#include <stdio.h>
#include <stdlib.h>

void handle_line(char *line) {
  printf("%s", line);
}

int main(int argc, char *argv[]) {
    int size = 1024, pos;
    int c;
    char *buffer = (char *)malloc(size);

    FILE *f = fopen("myfile.txt", "r");
    if(f) {
      do { // read all lines in file
        pos = 0;
        do{ // read one line
          c = fgetc(f);
          if(c != EOF) buffer[pos++] = (char)c;
          if(pos >= size - 1) { // increase buffer length - leave room for 0
            size *=2;
            buffer = (char*)realloc(buffer, size);
          }
        }while(c != EOF && c != '\n');
        buffer[pos] = 0;
        // line is now in buffer
        handle_line(buffer);
      } while(c != EOF); 
      fclose(f);           
    }
    free(buffer);
    return 0;
}

这是这里的某人写的,但我无法回复,因为我需要更多积分,哈哈。我不明白的部分是:

if(c != EOF) buffer[pos++] = (char)c;

buffer[pos++] 的作用是什么?它实际上增加了变量“pos”吗?另外,为什么它从 1 开始而不是从 0 开始? (pos 从 0 开始)。 我无法真正跟踪变量“pos”,而且我不知道为什么这里 buffer[pos] 是 0:

buffer[pos] = 0;

我阅读代码的方式是: 声明包含每行每个字符的缓冲区的大小(我的意思是,缓冲区在最后被释放,因此它保留了每一行的信息,对吧?),然后声明其他变量并分配该缓冲区的内存缓冲。 打开文件 myfile.txt,如果不为空,则使 pos = 0,然后使“c”存储文件的第一个字符(现在函数指向下一个字符),然后如果 c != EOF 表示未到达文件末尾,将字符“c”保存在缓冲区的位置1中(我在这里感到困惑,为什么是1而不是0)。然后,如果需要的话,重新分配两倍于以前的内存。对行中的每个字符执行此操作,直到到达 EOF 或\n。现在让 buffer[pos] = 0,我不知道“pos”有什么值,我假设他让 buffer[pos] = 0 来指示行的结尾?我不知道。打印该行,直到到达文件末尾。关闭文件,释放缓冲区上的内存。

救命啊!谢谢。

最佳答案

fgetc(fp) - 从指定的输入流 (fp) 读取下一个字符,并推进关联的文件位置指示器(您不需要)。如果成功,该函数将返回读取的字符;否则,返回值 EOF (-1)。

这是一个非常简单的示例,使用 fgetc() 读取文件的每个字符(并使用 fputc() 将其写入另一个文件)

char filename1[]={"c:\\play\\_in.txt"};//change paths as needed
char filename2[]={"c:\\play\\_out.txt"};

int main(void)
{
    FILE *fp1 = {0};
    FILE *fp2 = {0};
    int c=0;

    fp1 = fopen(filename1, "r");
    if(fp1)
    {
        fp2 = fopen (filename2, "w");
        if(fp2)
        {
            c = fgetc(fp1);
            while(c != EOF)
            {
                fputc(c, fp2);
                c = fgetc(fp1);
            }
            fclose(fp2);            
        }
        fclose(fp1);
    }

    return 0;
}

关于c - 在C中逐行读取每个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29688400/

相关文章:

c 语言 - 当我设置程序与主管一起自动运行时,system() 函数不起作用

c++ - 为什么 128 位变量应该与 16 字节边界对齐

c - 如何在 C 中打印微秒符号?

c++ - fork() 未声明的错误

c - 为什么我的for循环不遍历我的char_array?

c - 为什么我的 insert_node 函数会删除我的根? (C)

c - Windows互斥体的gcc编译错误

c - 查找与一个字符串的结尾和下一个字符串的开头相匹配的最长子字符串

c++ - 从文本文件创建 2d int 表。输出(可能)是内存块

C 段错误 11