我正在尝试从CSV文件读取到结构中。出于某种原因,社会安全号码的值也在读取地址,并且地址被第二次读取到newBin.address中。看起来sscanf在读取文件时忽略了分隔社会和地址的逗号,但在继续读取地址时确实注册了它。感谢您的帮助。
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define STRSIZE 70
typedef struct BIN_DATA {
unsigned int user_number;
char name[32];
char social_security[10];
char address[32];
} BIN_DATA;
int main()
{
// Define variables.
FILE *in, *out;
char str[STRSIZE];
// New BIN.
BIN_DATA newBin;
// Open files.
in = fopen("updated.txt", "r");
// Check files.
if(in == NULL)
{
puts("Could not open file");
exit(0);
}
while(fgets(str, STRSIZE, in) != NULL)
{
memset(&newBin, ' ', sizeof(BIN_DATA));
sscanf(str, "%6u, %[^,], %[^,], %[^nr]", &newBin.user_number, newBin.name,
newBin.social_security, newBin.address);
printf("%u. %s. %s. %s.n", newBin.user_number, newBin.name,
newBin.social_security, newBin.address);
}
return 0;
}
正在读取的文件:
289383,Estefana Lewey,591-82-1520,"9940 Ohio Drv, 85021"
930886,Burl Livermore,661-18-3839,"226 Amherst, 08330"
692777,Lannie Crisler,590-36-6612,"8143 Woods Drv, 20901"
636915,Zena Hoke,510-92-2741,"82 Roehampton St, 47905"
747793,Vicente Clevenger,233-46-1002,"9954 San Carlos St., 55016"
238335,Lidia Janes,512-92-7402,"348 Depot Ave, 29576"
885386,Claire Paladino,376-74-3432,"587 Front Ave, 32703"
760492,Leland Stillson,576-55-8588,"9793 Boston Lane, 08610"
516649,Wes Althouse,002-58-0518,"8597 Annadale Drive, 06514"
641421,Nadia Gard,048-14-6428,"218 George Street, 29150"
如注释中所述,social_security
成员没有分配足够的空间来容纳您正在读取的数据。它需要至少为12才能保持SSN,就像在末尾使用终止符所写的那样。
至于您在sscan((中使用的格式字符串,它几乎是正确的。但是,您需要将最大字符串长度绑定为与您的存储空间相匹配,因此例如,对于32的name
,您应该将其限制为31个字符,并在末尾为终止符保留一个字符。
我将social_security
字段更改为char social_security[12];
,然后将格式字符串更改为sscanf,如下所示:
"%6u, %31[^,], %11[^,], %31[^nr]"
我能够使用示例输入文件运行修改后的代码,以获得您描述的输出。你也可以在链接上试试:
可运行代码