【问题标题】:How to extract specific column from text file in C?如何从C中的文本文件中提取特定列?
【发布时间】:2021-12-13 14:03:37
【问题描述】:

我有一个 4 行 3 列的文本文件,例如:

1 2 5
3 5 6
8 8 2
1 1 0

我想将第三列从一个文件移到另一个文件,这样新文本将如下所示

5
6
2
0

我已经使用 fscanf 完成了这项工作,因此我每三次使用 fscanf 将其插入到新文件中 除了扫描前两个数字之外,还有更好的方法来访问第三列吗? 谢谢

【问题讨论】:

  • 没有。并不真地。如果您 100% 确定第 3 列始终正好是 1 个字符并且位于第 4 个字符位置(从 0 开始),则可以读取整行并将其编入索引。
  • 当您使用fscanf 转换整数值时,您无法确定输入行是否包含预期的 3 列。最好用fgets 读取整行,用sscanf 扫描并检查返回值(= 成功转换的值的数量)是否为3。您甚至可以使用转换4 个值的格式来检测可能包含更多值的行超过 3 列。
  • 如果您的输入文件在一行中有 6 个值,scanf 将很难将其与分布在两行中的 6 个值区分开来。同样,如果您有 6 个值分布在 6 行中。如果您关心输入中的空格,scanf 可能是错误的工具。

标签: c text multiple-columns


【解决方案1】:

*scanf 远比你对这么简单的事情所需要的复杂得多。当您可以避免scanf 时,您应该避免。 (你几乎总是可以避免它,“几乎”只是我对冲)。这是一项简单的任务,应该使用简单的工具来完成。例如:

#include <ctype.h>
#include <stdio.h>

/* A simple implementation of `awk '{print $3}'` */

int
main(int argc, char* argv[])
{
    int c;
    int column = 0;
    int last = ' ';
    while( (c = getchar()) != EOF ){
        if( ! isspace(c) && isspace(last)){
            column += 1;
        }
        if( c == '\n' ){
            column = 0;
            putchar(c);
        } else if( column == 3 ){
            putchar(c);
        }
        last = c;
    }
}

【讨论】:

    【解决方案2】:

    哦,我明白了。这对我有用。

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char line[25];
        FILE * file;
    
        file = fopen("text1.txt", "r");
    
        fscanf(file, "%[^\n]", &line);
    
        printf("%s", line + strlen(line) - 1);
    
        fclose(file);
    
        return 0;
    }
    

    基本上,您会将整行存储在一个字符数组中,然后您将打印该字符串的某些部分(字符数组)。考虑到这一点,您可以设法处理多行。

    希望这对您有所帮助。

    【讨论】:

    • FILE * file; ... printf("%s", file + strlen(file) - 1); WUT!?!?!? strlen(file) 到底应该做什么?
    • 打印最后一列,我测试过了。他想从文件中读取并打印出最后一列,对吧?
    • 再次仔细阅读您的代码。
    • 修好了,这个怎么样?对不起大声笑。但是,这应该可行。
    • egarding" fscanf(file, "%[^\n]s", &amp;line); 这表示换行符后面必须跟字符s 这是一个错误,因为stdin 中的下一个字符将是'\n',而不是@987654327 @.建议:fscanf(file, "%[^\n]", &amp;line);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2023-03-25
    相关资源
    最近更新 更多