【问题标题】:Read data from file line by line with different data types使用不同的数据类型逐行读取文件中的数据
【发布时间】:2013-10-27 12:22:45
【问题描述】:

我有一个.txt 文件:

A B C
England vs autralia
2004
100
D E F
japan vs argentina
3045
140
D E F
india vs pakistan
2012
150
J F G
south africa vs india
1967
100
K GHD D
australia vs pakistan
1993
453
Z E Q
pakistan vs england
2013
150  

我想读取它并存储在变量中。 (每行转到一个变量)。

我有这段代码,但它一次读取一行,并且是一个字符串。

if ( file != NULL )
{
    i=1;
    char line [ 100 ]; /* line size */
    while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
        {
            fputs ( line, stdout ); /* write the line */
            i++;
        }
    fclose ( file );
}  

其实我想一次读 4 行。但似乎不可能。所以我可以将第 4 行放在由空格分隔的单行中,但在这种情况下,将无法扫描多字字符串。

那么,我该怎么做呢?

【问题讨论】:

  • fgets ( line, stdout ); 你可能是指 fputs() 这里。
  • @wildplasser 是的。这是我得到的代码。检查更新的问题。
  • 我不在乎你是怎么得到它的,它只是看起来不对,编译器会至少发出警告。 BTW:你考虑过循环吗?
  • 如果每 4 行构建一个实体,则建议将它们放在一行中并用分隔符分隔,这种格式称为 csv
  • @A4L:这值得商榷。多行格式更易于读写:不需要引用/转义逗号或嵌入引号,唯一的特殊字符是 '\n'。

标签: c file-io


【解决方案1】:

使用计数器确定您在四行中的哪一行:

#include <stdio.h>
#include <string.h>

void doit( FILE *file)
{
char line [ 100 ]; /* line size */
unsigned iii;
size_t len;

    for(iii=0;  fgets ( line, sizeof line, file); iii++ ) /* read a line */
        {
        len = strlen(line);
        while (len && line[len-1] == '\n') line[--len] = 0;
        switch (iii % 4) {
        case 0: /* handle first line here */
               break;
        case 1: /* handle second line here */
               break;
        case 2: /* handle third line here */
               break;
        case 3: /* handle fourth line here */
               break;
                }
        }
}

【讨论】:

  • 这不是将所有行扫描为strings吗?
  • 是的。最初每一行都是一个字符串。但是您可以在每种情况下添加专门的代码,例如第三行 (case 2:) 看起来像一年,第四行也看起来像数字。使用 sscanf() 或 atoi() 或 strtol() 或任何你需要的东西扫描字符串。
  • 它正在跳过每一行。 ://
  • 不,它没有。注意:我将 iii++ 移到了它所属的 for() 语句中。
  • 可能是fgets() 的流浪\n 导致问题。
【解决方案2】:

逐行阅读,由于格式似乎是固定的,您总是知道每一行都有哪些类型。

例如像这样伪代码

while (continue_reading)
{
    // E.g. "A B C"
    get_line()
    parse_line_into_three_string()

    // E.g. "England vs autralia"
    get_line()
    parse_whole_line_as_a_single_string()

    // E.g. "2004"
    get_line()
    parse_line_as_a_number()

    // E.g. "100"
    get_line()
    parse_line_as_a_number()

    do_something_with_all_data()
}

【讨论】:

  • 没有得到你。这怎么可能?它逐行读取文件,那么它如何一次扫描 4 行?
  • @xmpirate 读取一行,解析它,读取下一行,解析它,等等。
  • @mrudult 我发布的伪代码应该足以让您开始使用。 fgets你已经知道了,现在我推荐你学习sscanf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多