我正在练习文件I / O。制作了一个示例程序来从用户那里获取人员数据,并将其作为格式化数据存储在.txt文件中,这样我就可以在内部进行搜索等。
这是我的代码:
typedef struct{
uchar personelNo[20];
uchar department[40];
uchar name[20];
uchar lastname[20];
}Personel;
void add_personnel() {
FILE* f = fopen(FILE_NAME, "a+");
Personel temp;
check("Enter personel name: ", temp.name, 1);
check("Enter personel surname: ", temp.lastname, 1);
check("Enter personel department: ", temp.department, 1);
fprintf(f, "%d\t%s\t%s\t%s\n", get_last_p_number(f)+1, temp.name, temp.lastname, temp.department);
}
void error_function(const char* buffer, int no_conversions, char *additional_info) {
fprintf(stderr, "Something went wrong. Here: %s , You entered:\n%s\n", additional_info ,buffer);
fprintf(stderr, "%d successful", no_conversions);
exit(EXIT_FAILURE);
}
void check(uchar* print_string, uchar* to_be_written, int buffer_size) {
int r;
char temps[BUFF_SIZE];
fprintf(stdout, "%s", print_string);
//fflush(stdout);
if (fgets(temps, BUFF_SIZE, stdin) == NULL) error_function(temps, 0, "fgets");
if ((r = sscanf(temps, " %s", to_be_written)) != buffer_size) error_function(temps, r, "sscanf");
}
int main()
{
int selection;
welcome_screen();
fprintf(stdout, "%s", "Enter your selection: ");
scanf(" %d", &selection);
if (selection == 1) {
add_personnel();
}
}
当我尝试运行时,它运行良好,可以得到我的welcome_screen函数,并且当程序要求选择时。但是,当我键入我的选择时,它会立即退出,并显示如下:
Enter personel name: Something went wrong. Here: sscanf , You entered:
-1 successful
是的,我什至无法弄清楚我的错误功能告诉了我什么。有谁知道这是什么问题?我以为是要刷新缓冲区,但是尝试时却无济于事。
*编辑:忘记了添加add_personel函数,现在它在这里。
答案 0 :(得分:1)
error_function()
为(r = sscanf(temps, " %s", to_be_written)) != buffer_size
时调用 false
。您将temps
,r
和"sscanf"
传递到error_function()
,错误输出表明temps
是一个空字符串或仅包含空格,并且{{ 1}}表示在r == -1
为空或只有空格的情况下输入失败。
由于使用temps
格式说明符进行了更早的scanf()
调用,因此出现了问题。当您键入:
%d
1<newline>
仅使用%d
位,保留1
并在随后的<newline>
调用中提取。
为确保您消耗(并丢弃)fgets()
项之后的所有非数字字符-读取所有字符,直到selection
:
<newline>
答案 1 :(得分:0)
通过更改我的检查功能来解决此问题:
void check(uchar* print_string, uchar* to_be_written, int buffer_size) {
int r;
char temps[BUFF_SIZE];
fprintf(stdout, "%s", print_string);
//fflush(stdout);
if (fgets(temps, BUFF_SIZE, stdin) == NULL) error_function(temps, 0, "fgets");
if ((r = sscanf(temps, " %s", to_be_written)) != buffer_size) error_function(temps, r, "sscanf");
}
对此:
void check(uchar* print_string, uchar* to_be_written, int buffer_size) {
int r;
fprintf(stdout, "%s", print_string);
//fflush(stdout);
if ((r = fscanf(stdin, " %s", to_be_written)) != buffer_size) error_function(stdin, r, "sscanf");
}
它奏效了。
感谢@ user3121023指出不要混用fgets
和scanf
。