Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sscanf和fgets读取多行文本文件_C_Text_Struct_Fgets_Scanf - Fatal编程技术网

使用sscanf和fgets读取多行文本文件

使用sscanf和fgets读取多行文本文件,c,text,struct,fgets,scanf,C,Text,Struct,Fgets,Scanf,我需要读一个文本文件,然后把结果打印出来。我使用结构来保存变量,不需要创建数组。问题是,代码似乎要么没有读取第二行,要么打印错误,结果完全混乱。以下是文本文件: UTSA01 8 0 150.00 80.00 Armadillos,utsa@xyz.com,(210)555-1111,Jean E Us COM001 7 1 150.00 75.00 Comm Eagles,maeking@xyz.com,(210)555-2222,Mae King SOUTH1 5 3 120.00 75.

我需要读一个文本文件,然后把结果打印出来。我使用结构来保存变量,不需要创建数组。问题是,代码似乎要么没有读取第二行,要么打印错误,结果完全混乱。以下是文本文件:

UTSA01 8 0 150.00 80.00
Armadillos,utsa@xyz.com,(210)555-1111,Jean E Us 
COM001 7 1 150.00 75.00
Comm Eagles,maeking@xyz.com,(210)555-2222,Mae King
SOUTH1 5 3 120.00 75.00
Slam Dunk,slamdunk@gmail.com,(210)555-3333,Jerry Tall
ALHGHT 4 4 175.00 100.00
Cake Eaters,sliverspoon@xyz.com,(210)555-6666,E Z Street
UNKN01 1 7 150.00 50.00 
Org New Blk,bobwire@xyz.com,(210)555-1234,Bob Wire
NEWB01 0 8 120.00 75.00
River Rats,riverrat@xyz.com,(210)555-4444,Rock D Boat
UNKN02 3 5 150.00 75.00
Hackers,cyber@gmail.com,(210)555-5555,Tom E Gunn
我已经在一段时间的循环中使用了sscanf和fgets。这是我的密码:

char szInputBuffer[100];
/* Create a struct array that will hold the data that is being read in */
Team teams;

/* The following segment contains the header for the file */
printf("%-7s%-13sWins Loss Fee Amt  Paid Amt\n", "Id", "Team Name");
printf("                %-21s%-14sEmail\n", "Contact Name", "Phone");

/* The following structure will begin to read file data into the respectful 
   variables until the end-of-file marker has been reached.
   The data will be used later to print out. */

while(!feof(pFileTeam)) {
    fgets(szInputBuffer, 100, pFileTeam);
    sscanf(szInputBuffer, "%7s %d %d %lf %lf",
                           teams.szTeamId,
                           &teams.iWins,
                           &teams.iLosses,
                           &teams.dFeeAmount,
                           &teams.dPaidAmount);

    fgets(szInputBuffer, 256, pFileTeam);                      
    sscanf(szInputBuffer, "%[^,]%[^,]%[^,]%[^\n]",
           teams.szTeamName,
           teams.szEmailAddr,
           teams.szPhone,
           teams.szContactname);


    printf("%-7s%-13s%-5d%-5d%-9.2lf%-8.2lf\n",
        teams.szTeamId,
        teams.szTeamName,
        teams.iWins,
        teams.iLosses,
        teams.dFeeAmount,
        teams.dPaidAmount);
    printf("                %-21s%-14s%-5s\n",
        teams.szContactname,
        teams.szPhone,
        teams.szEmailAddr);
}//END while
我遇到的问题是,我可以读取并打印文件的第一行,第二行的第一个字符串很长。然而,我一碰到逗号,它似乎就被绊倒了。我不确定是我在sscanf中使用的说明符,还是正在打印。我真的不知道该怎么办

以下是我编译(gcc)和执行时的结果:

Id     Team Name    Wins Loss  Fee Amt   Paid Amt
                    Contact Name         Phone         Email
    UTSA01 Armadillos      8    0    150.00     80.00

    COM001 Comm Eagles     7    1    150.00     75.00

    SOUTH1 Slam Dunk       5    3    120.00     75.00

    ALHGHT Cake Eaters     4    4    175.00    100.00

    UNKN01 Org New Blk     1    7    150.00     50.00

    NEWB01 River Rats      0    8    120.00     75.00

    UNKN02 Hackers         3    5    150.00     75.00
它实际上在我的终端的第二行显示了一些奇怪的字符,但它们似乎没有出现在这里

编辑:我添加了逗号,但输出仍然不起作用。只有最后一行将显示szContactname信息。所有其他的都会留下空白,但手机和电子邮件会显示:

Id     Team Name    Wins Loss  Fee Amt   Paid Amt
                    Contact Name         Phone         Email
    UTSA01 Armadillos      8    0    150.00     80.00
                    (210)555-1111 utsa@xyz.com
    COM001 Comm Eagles     7    1    150.00     75.00
                    (210)555-2222 maeking@xyz.com
    SOUTH1 Slam Dunk       5    3    120.00     75.00
                    (210)555-3333 slamdunk@gmail.com
    ALHGHT Cake Eaters     4    4    175.00    100.00
                    (210)555-6666 sliverspoon@xyz.com
    UNKN01 Org New Blk     1    7    150.00     50.00
                    (210)555-1234 bobwire@xyz.com
    NEWB01 River Rats      0    8    120.00     75.00
                    (210)555-4444 riverrat@xyz.com
    UNKN02 Hackers         3    5    150.00     75.00
                    Tom E Gunn           (210)555-5555 cyber@gmail.com
一些问题

  • 使用
    fgets()
    缓冲区而不检查结果。在尝试使用
    szInputBuffer
    之前,请检查fgets()的结果。进一步的
    feof()
    检查不需要

  • 使用幻数。想想看<代码>szInputBuffer[]没有那么大

    char szInputBuffer[100];
    ...  
    // fgets(szInputBuffer, 256, pFileTeam);   
    if (fgets(szInputBuffer, sizeof szInputBuffer, pFileTeam) == NULL) break;
    
  • 无用的格式
    “%[^,]%[^,]…”
    尝试在不读取的情况下读取文件流中最多一个“
    ”、“
    的文本以及“
    ”、“
    的叶子。健壮的代码限制字符串输入并检查
    sscanf()
    结果

    // sscanf(szInputBuffer, "%[^,]%[^,]%[^,]%[^\n]", teams.szTeamName, ...
    // Assuming szTeamName[10]
    if (4 != sscanf(szInputBuffer, "%9[^,],%9[^,],%9[^,],%9[^\n]", teams.szTeamName, ...) {
      break;
    }
    
  • 也许还有其他问题


  • 您可能还有其他问题,但对于初学者来说:我添加了逗号,但最后一行是唯一正确的。其他行全部打印电话号码和电子邮件,但没有联系人姓名。但是,最后一行以正确的格式打印联系人姓名、电话和电子邮件。好的,所以我使用了你的建议,它的运行方式与以前相同。我理解你的意思,这真的很有帮助。然而,我很抱歉,结果仍然让我困惑,因为我不明白如何将sscanf上的检查解析为4,并且仍然不包含一个变量的数据。更令人困惑的是,变量在前6个集合中为空,但最后一个集合包含信息。因此,我更改了控制换行符的正则表达式,只使用了一个可以接受字符和空格的正则表达式-我知道这并不理想-它起了作用。谢谢你给我指出了正确的方向,这真的帮了我很大的忙!
    // sscanf(szInputBuffer, "%[^,]%[^,]%[^,]%[^\n]", teams.szTeamName, ...
    // Assuming szTeamName[10]
    if (4 != sscanf(szInputBuffer, "%9[^,],%9[^,],%9[^,],%9[^\n]", teams.szTeamName, ...) {
      break;
    }