在C语言中逐行读取每个字符
我在寻找一个解决方案,如何从txt文件中逐行读取字符,我找到了一个,但我没有得到代码的某些部分。就是这样:在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
#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;
}
缓冲区[pos++]做什么?它实际上增加了变量“pos”吗?还有,为什么它从1开始而不是0?(位置从0开始)。
我无法真正跟踪变量“pos”,也不知道为什么这里的buffer[pos]是0:
buffer[pos] = 0;
我阅读代码的方式是:
声明包含每行每个字符的缓冲区的大小(我的意思是,缓冲区在最后是空闲的,所以它保留了每行上的信息?),然后声明其他变量并分配缓冲区的内存。
打开文件myfile.txt,如果不为空,则将pos=0,然后将文件的第一个字符(现在函数指向下一个字符)设为“c”,如果c!=EOF表示未到达文件末尾,请将字符“c”保存在缓冲区的位置1(我在这里感到困惑,为什么是1而不是0)。然后,如果需要,realloc的内存将是以前的两倍。对行中的每个字符执行此操作,直到达到EOF或a\n。现在让buffer[pos]=0,我不知道“pos”的值是多少,我假设他让buffer[pos]=0表示行的结束?idk。打印行,直到到达文件末尾。关闭文件,释放缓冲区上的内存
救命啊!谢谢。-从指定的输入流(fp)中读取下一个字符,并推进相关的文件位置指示器(无需)。如果成功,函数将返回读取的字符;否则,将返回值EOF(-1)
下面是一个非常简单的示例,使用fgetc()读取文件的每个字符(并使用fputc()将其写入另一个文件)
pos++
是一个后期增量;当pos==0
时,它返回值0
,但将pos
增加到1
。buffer[pos]循环后的赋值=0代码>可能会更清晰,因为缓冲区[pos]='\0'代码>,表示分配了空字节,因此字符串以空结尾。确保字符串以null结尾非常重要。缓冲区[pos++]-这是一个post增量,因此如果pos从0开始,它将引用数组元素缓冲区[0],然后将pos设置为1。是的,缓冲区[pos]=0将字符串结尾字符放在刚刚读取的字符行的末尾。在这之后,它可以被视为一个c字符串,因此可以用printf()写出,只要看一眼c手册,和/或一个简单的测试程序就会回答你的问题!我怎么能忘记那件事啊哈。太好了!这是怎么一回事?而(c=fgetc(fp1))@kwrnel-只要结果>0,就会继续读取下一个字符。EOF(文件结尾)从fgetc()
as-1返回,这将导致while循环退出。这是错误的!!!测试:`#include int main(){int c;while(c=-1){printf(“running…\n”)}返回0;}`@kwrnel-我不明白你在说什么。我发布的代码虽然只是一个简单的示例,但它编译、运行并用于读取一个文件,并将内容放入另一个文件中。你在上述评论中所写的内容与此无关。请解释你的观点。你是在使用作业作为条件。
buffer[pos] = 0;
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;
}