【问题标题】:Extracting parts of a line in a text file into a new file in C programming在 C 编程中将文本文件中的部分行提取到新文件中
【发布时间】:2012-12-08 14:18:15
【问题描述】:

我正在尝试从文本文件中提取部分行,并将其输出到 UNIX 平台下的 C 编程中的新文件中。例如,我有 file1.txt 如下:

设备:ABCDE1

日期:2012 年 12 月 12 日

操作员=John Doe

我希望它在 file2.txt 中显示为:

ABCDE1,2012 年 12 月 12 日,John Doe。

这是我到目前为止的代码,我打开并写入文件部分,但无法弄清楚如何在“设备:”之后提取信息,而不显示“设备:”它自己。我的代码只是复制了file1的第一行,放到了文件2中:


#include "stdio.h"
main()
{
    FILE *fs, *ft;
    char ch ;
char file[100]="" ;
char Device [100];
char Date [80];

printf ("Enter file name and directory:");
scanf ("%s",&file);

    fs = fopen (file, "r") ;
    if ( fs == NULL )
    {
           puts ( "Cannot open source file" ) ;
           exit( ) ;
    }

    ft = fopen ( "file2.txt", "w" ) ;
    if ( ft == NULL )
    {
           puts ( "Cannot open target file" ) ;
           fclose ( fs ) ;
           exit( ) ;
    }


fscanf(fs, "%s %s", Device,Date);
fprintf(ft, "%s %s\n", Device,Date);


    fclose ( fs ) ;
    fclose ( ft ) ;
return 0;
}

fscanf() 是一个很好的命令吗?或者是否有任何其他建议的命令来完成这项工作?提前致谢。

【问题讨论】:

    标签: c unix text line


    【解决方案1】:

    fscanf() 是一种可能使用的函数。你会遇到“John Doe”的一些问题,因为 scanf() 系列函数将 %s 视为“空格分隔的字符串” - 所以你会读到“John”,然后下一步将得到 Doe 和其他任何东西在下一行,这可能不是您想要的。

    在 fscanf() 本身中有解决这个问题的方法。或者,您可以使用 fgets() 读取整行,然后使用一些字符串函数将其拆分。有趣的是,线条的格式略有不同,这让生活更具挑战性。

    我故意不告诉你具体怎么做,因为我很确定你这样做的部分原因是为了学习。而且你从抄袭别人的作品中得不到任何东西。

    【讨论】:

    • 感谢您的信息。是的,我对 C 编程相当陌生,我正在努力学习。我确实遇到了 fgets() 命令,并且在过去几个小时左右的时间里一直在网上阅读和玩弄它。我似乎找不到正确的方法让指针搜索“设备:”、“日期:”并提取显示在该行其余部分的字符。你对这部分有什么建议吗?谢谢!
    • 我同意 Mats 的观点,即使用 fgets 然后解析文本行比使用 fscanf 更容易。查找并学习使用strtok function
    • 写一个小函数char *find_in_string(char *haystack, char *needle)这将是一个不错的练习,它将输入字符串作为“干草堆”,然后通过它找到“:”或一些这样,并将指针返回到字符串的其余部分。虽然 strtok 和其他 str 函数非常适合做这类事情,但学习如何手动进行字符串搜索也很方便。如果您发布一些尝试这样做,我相信我们可以提供提示(可能最好作为一个新问题)
    • 好的,我有这个工作,它显示文件的第一行: fgets(device, 100, fs); fputs(设备,英尺);但是我怎样才能将它与 char *find_in_string(char *device:, char *Date) 结合起来呢?我用这个尝试了一些东西,但不知道它是如何工作的,甚至无法让它编译..
    【解决方案2】:

    fscanf 函数从文件中读取数据(第一个参数),根据给定的格式(第二个参数)解析它,并根据格式加载指定的变量(其余参数)。请参阅定义here。这意味着在您调用 fscanf 之后,您的 DeviceDate 缓冲区中存储了字符串 Device:ABCDE1。而不是 fprintf'ing 设备和日期,只需打印日期。你现在必须设置一个循环来遍历整个文件,fscanf'ing 直到你得到一个 EOF 标志并且在每次迭代时只打印第二个字符串。

    【讨论】:

      【解决方案3】:

      好的,所以我的代码开始工作了,它使用 igets 扫描字符串行,并使用 printf(&buffer[7]); 仅在 "device:" 之后输出答案.由于我将使用的记录将具有“设备、日期、操作员等”的固定位置,我什至不必搜索这些词,我只需将指针指向这些行。

      但这是我的新问题,我当前的代码只读取文件的第一行,我怎样才能让它读取不同的行?例如,如果我只希望它读取第 1、2 和 5 行。

      这是我的完整代码:

        main()
        {
          FILE *fs, *ft ;
          char ch ;
      char file[100]="" ;
      char line1[50];
      
      printf ("Enter file name and directory:");
      scanf ("%s",&file);
      
          fs = fopen (file, "r") ;
          if ( fs == NULL )
          {
                 puts ( "Cannot open source file" ) ;
          }
      
          ft = fopen ( "book5.txt", "w" ) ;
          if ( ft == NULL )
          {
                 puts ( "Cannot open target file" ) ;
                 fclose ( fs ) ;
          }
      
          fgets(line1,50,fs);
      printf(&line1[7]);
      printf(",");
      printf(&line1[7]);
      
          fclose ( fs ) ;
          fclose ( ft ) ;
       }
      

      感谢您的帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多