在C编程中将文本文件中的部分行提取到新文件中

时间:2012-12-21 00:36:51

标签: c unix text line

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

设备:ABCDE1

日期:12/12/12

运营商= John Doe

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

ABCDE1,12 / 12/12,John Doe。

这是我到目前为止的代码,我得到了开头并写入文件部分,但是无法弄清楚如何在“Device:”之后提取信息,而不显示“Divice:”它自己。我的代码只复制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()是一个很好的命令吗?或者是否有任何其他建议的命令来使这项工作?提前谢谢。

3 个答案:

答案 0 :(得分:6)

fscanf()是一种可能的功能。你会得到一些“John Doe”的问题,因为scanf()系列函数将%s视为“空格分隔的字符串” - 所以你会读到“John”,然后下一步就会得到Doe等等在下一行,这可能不是你想要的。

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

我故意不告诉你具体如何做到这一点,因为我非常肯定你为什么这样做是为了学习。你从别人的工作中学到了什么。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

好的,所以我让我的代码工作,它使用igets扫描字符串行,并使用 printf(& buffer [7]); 只输出“设备后的答案” :”。由于我将使用的记录将具有“设备,日期,操作员等”的固定位置,我甚至不必搜索这些单词,我只需将指针放在那些行上即可。

但这是我的新问题,我目前的代码只读取文件的第一行,如何才能读取不同的行?例如,如果我只想要它读取第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 ) ;
 }

感谢您的帮助!