我正在使用fscanf从CSV文件中读取一些值,我想确保读入值的数据不会太大并导致缓冲区溢出。
我的csv文件的格式为int,string,string,我要读的代码如下(我稍后会修复while条件):
while(fscanf(f, "%d,%[^,],%[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/
使用scanf时,我会指定长度,以防止溢出:scanf("%20f", example);
但如果我尝试上述内容:while(fscanf(f, "%d,%20[^,],%10[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/
代码执行时出现崩溃。
答案 0 :(得分:3)
尝试fscanf_s
,此功能具有安全性增强功能。
http://msdn.microsoft.com/en-us/library/6ybhk9kc(v=vs.90).aspx
答案 1 :(得分:2)
阅读字符时,你不能用fprintf做到这一点。
我会首先读取整行,例如,使用getline()
,找到分隔符(或标记行),然后解析各个元素。
顺便说一下,你崩溃的原因也可能是inArray
的错误定义/初始化。
答案 2 :(得分:0)
OP可能在fscanf()
中使用了错误的宽度。
虽然OP没有发布关于inArray[i]
的详细信息,但我们假设它是
struct {
int ID;
char label[20];
char brand[10];
} inArray[100];
格式应为
"%d,%19[^,],%9[^,]"
19的宽度需要比目的地的大小小1,因此允许'\ 0'的位置。