我正在寻找一个关于如何从txt文件中的每行读取char的解决方案,我找到了一个,但我没有得到代码的某些部分。就是这样:
#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;
}
这是由来自这里的人写的,但是我不能回复'因为我需要更多的点lol。我不明白的部分是:
if(c != EOF) buffer[pos++] = (char)c;
缓冲区[pos ++]有什么作用?它实际上增加了变量“pos”吗?另外,为什么从1开始而不是0? (pos从0开始)。 我无法真正跟踪变量“pos”,我不知道为什么缓冲区[pos]为0:
buffer[pos] = 0;
我阅读代码的方式是: 声明包含每一行中每个字符的缓冲区的大小(我的意思是,缓冲区在结尾处是空闲的,所以它保持每一行的信息都正确吗?),然后声明其他变量并分配其中的内存缓冲。 打开文件myfile.txt,如果它不是null,则使pos = 0,然后使“c”存储文件的第一个字符(现在函数指向下一个字符),然后如果c!= EOF意味着没有到达文件的结尾,将字符“c”保存在缓冲区的位置1(我在这里感到困惑,为什么1而不是0)。然后根据需要重新分配两次内存。对于你到达EOF或\ n的行中的每个字符都这样做。现在使缓冲区[pos] = 0,我不知道“pos”有什么值,我假设他使缓冲区[pos] = 0来表示该行的结束? IDK的。打印该行,直到您到达文件末尾。关闭文件,释放缓冲区中的内存。
帮助!感谢。
答案 0 :(得分: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;
}