【问题标题】:Reading from text file skips first line从文本文件中读取会跳过第一行
【发布时间】:2015-03-07 04:40:25
【问题描述】:

我正在使用 strtok 从一个看起来像这样的文件中读取数据。感谢我最后一个问题的回答,段错误消失了。但是,我现在遇到了读入文件的问题,没有在第一行被读取

再一次:我有一个看起来像这样的文件(test.txt)

5f6
2f6

还有一个如下所示的c文件:

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

int main(int argc, char * argv[])
{
    char buf[100];
    char *ptr;
    char *ptr2;
    char *ptr3;
    char *ptr4;
    int a,b,c,d;
    FILE *file;

    initscr();
    cbreak();
    noecho();

    if (argc > 1)
     {
        file = fopen(argv[1], "r");
        if (file == NULL) //doesn't return null
            return -1;
        while (fgets(buf,100,file) != NULL)
         {
            ptr  = strtok(buf,"f");
            ptr2 = strtok(NULL," ");
            ptr3 = strtok(NULL,"f");
            ptr4 = strtok(NULL," ");
            if (ptr != NULL)
                a = atoi(ptr);
            if (ptr2 != NULL)
                b = atoi(ptr2);
            if (ptr3 != NULL)
                c = atoi(ptr3);
            if (ptr4 != NULL)
                d = atoi(ptr4);

            mvprintw(0,0,"Values are a %d b %d c %d d %d",a,b,c,d);
         }
     }
    refresh();
    getchar();
    endwin();

    return 0;
}

从文本文件中,值应该是(预期输出):a = 5, b = 6, c = 2, d = 6;

但程序输出:a = 2, b = 6, c = 0, d = 0

我尝试修改文本文件的条目(更改周围的值),但这似乎没有产生任何改进。我也尝试过更改目录,用新文件在另一个目录中重新编写这段代码(以防它是某种内存问题,但一切都无济于事。)任何帮助将不胜感激。

【问题讨论】:

  • strtokstr(没有定义?),但 fgets 变成 buf。这是复制粘贴错误吗?您还需要命令行参数,但始终阅读"test.txt"

标签: c file pointers text while-loop


【解决方案1】:

两件事:fgets 将读取行,即直到找到换行符或缓冲区已满。使用您当前的文件布局,您无法通过一个 fgets 获得所有四个值。

您实际上从文件中读取了两行,但是您覆盖了结果,因为您没有前进光标位置;你总是写在 (0, 0)。所以你只能看到最后一行的值。

【讨论】:

  • 所以在一个光标位置打印 a,b 而在另一个光标位置打印 c,d 是您的建议吗?我不确定我是否完全理解您的第一点。
  • 如果您不前进光标(或使用自动执行的打印功能),您将不会看到所有结果,因为您不断地覆盖它们。您可能应该使用printw,它会自动使光标前进。
  • 关于行:在第一个fgets 调用之后,buf"5f6\n",包括换行符。这就是文件被读取的距离。程序还不知道下一行"2f6\n"。所以它只找到两个令牌。因此,要么更改您的文件格式以在一行中包含所有所需的值,要么对fgets 进行第二次调用。
  • 我已经尝试过您的推进光标建议,但结果相同。至于 fgets,如果 buf 是 "5f6\n" 那为什么要打印下一行的值呢?
  • 你有两个问题,但你认为只有一个。请把它们分开,先解决文件读取,但不要使用ncurses。只需将值打印到控制台即可。或者使用调试器并查看值。任何。我不能比我已经提出的解决方案更清楚了。
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2014-01-26
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多