如何正确读取文本文件中的数字?

时间:2016-05-15 17:22:31

标签: c file text

我想用C编写一个彩票程序,它将选定的前几周的数字读入数组。我有一个文本文件,其中有5列用制表符分隔。我的问题如下:

  • 我应该用什么来分隔列? (例如逗号,分号,制表符或其他内容)
  • 我应该在最后一行包含一种EOF吗? (例如-1,“EOF”)是否有任何公认或“官方”的约定?
  • 我应该使用哪个功能来阅读这些数字?是否有任何正确或“接受”的方式从文本文件中读取数据?

我曾经为“谁想要成为亿万富翁”游戏写一个C程序。在那一个中​​,我使用了一种函数,它将每一行读入一个足以容纳整行的数组。之后我将其数据分成如下变量:

line: "text1";"text2";"text3";"text4"endline (-> line loaded into a buffer array)
text1 -> answer1 (until reaching the semicolon)
text2 -> answer2 (until reaching the semicolon)
text3 -> answer3 (until reaching the semicolon)
text4 -> answer4 (until reaching the end of the line)
endline -> start over, that is read a new line and separate its contents into variables.

它工作正常,但我不知道它对程序员来说是否足够好。 (顺便说一下,我还不是程序员,我在大学学习计算机科学)

欢迎每一个答案和建议。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

scanf()系列函数不关心换行符,因此如果要处理行,则需要首先读取行,然后使用sscanf()处理行。 scanf()系列函数还可以互换地处理空格 - 空格,制表符,换行符等。使用制表符作为分隔符很好,但空白也可以。显然,如果您一次阅读和处理一行,换行确实不会影响扫描。

int lottery[100][5];
int line;
char buffer[4096];

for (line = 0; fgets(buffer, sizeof(buffer), stdin) != 0 && line < 100; line++)
{
    if (sscanf(buffer, "%d %d %d %d %d", &lottery[line][0], &lottery[line][1],
               &lottery[line][2], &lottery[line][3], &lottery[line][4]) != 5)
    {
        fprintf(stderr, "Faulty line: [%s]\n", line);
        break;
    }
}

这停止在EOF,太多行和一条错误的行(一行不以5个数字开头;如果你愿意,你可以在循环中检查它们的值等 - 但是你需要什么样的测试跑步?)。如果要验证空白分隔符,则必须更加努力。

也许你想在5个数字之后只测试空格和换行符;这有点棘手(可以这样做;在sscanf()中查找%n转换规范)。