C-从文本文件中的每一行读取特定数量的单词

时间:2014-12-11 16:49:27

标签: c file-io

我想只读取文件中每行的前五个字符(包括空格)。意思是,在指针到达某一行的第5个字符后,我希望指针然后重置到下一行的开头,并继续这样做,直到它到达EOF

例如,如果我想读取文件中每行的前5个字符,则应该产生以下结果:

Hello World --->  Hello
blah blah   --->  blah 
Goodbye     --->  Goodb

我已经尝试通过实现fgets来实现这一点,但是我无法弄清楚如何在读取5个字符后重置指针:

while (feof(inputFile) == 0) {
    fgets(str, 6, inputFile); 

发生的事情是fgets在第5个字符处停止,但不是转到下一行,而是继续读取同一行中接下来的5个字符。

一旦读入5个字符,有没有办法让fgets从下一行开始?任何未实现fgets的替代方法也是可以接受的。

3 个答案:

答案 0 :(得分:1)

试试这个

void trimFile(const char *inputFile, const char *outputFile, int length) {
    FILE *fin, *fout;
    fin  = fopen(inputFile, "r");
    fout = fopen(outputFile, "w");
    char str[length + 1];
    while (fgets(str, sizeof str, fin)){
        char *p = strchr(str, '\n');
        if(p){
            fputs(str, fout);
        } else {
            int ch;
            while((ch=fgetc(fin))!='\n' && ch != EOF)
                ;
            fprintf(fout, "%s\n", str);
        }
    }
    fclose(fin);
    fclose(fout);
}

答案 1 :(得分:1)

fgets(char * str, int num, FILE * f)读取最多(num-1)个字节并附加终止空字符。
如果你想跳过剩下的行,你的文件是固定的行长,那么你可以 使用fseek ( FILE * f, long int offset, int origin )将文件索引的位置设置为行尾。

答案 2 :(得分:1)

我也明白了,这有效:

while (feof(fi) == 0) {
    fgets(str, 6, fi);
    while ((c = getc(fi)) != '\n' && c != EOF) {
      ;
    }
...

从每行读取5个字符,getc将指针移回下一行的开头。