我正在尝试创建一个文本文件并写入它,但是当我打开文本文件时输出错误。
样品:
Please enter number of students?
2
Please Enter details of the Students in the Following sequence: Name Age GPA
alex 18 3.2
dan 21 3.5
输出:
tttttttttkkkkkkkkksssssssssss
代码:
#include "stdafx.h"
#include<stdio.h>
#include<Windows.h>
struct Student {
WCHAR name[20];
int age;
float gpa;
};
int _tmain(int argc, _TCHAR* argv[])
{
struct Student St;
int NumOfStu;
printf("Please enter number of students\n");
scanf("%d" , &NumOfStu);
HANDLE f = CreateFile(L"d:\\SPR2.txt" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
if(f == INVALID_HANDLE_VALUE)
{
printf("Could not Create The File\n");
return 0;
}
printf("Please Enter details of the Sutdents in the Following sequence: Name Age GPA\n");
DWORD actual;
for(int i=0 ;i<NumOfStu;i++)
{
scanf("%s %d %f" , &St.name , &St.age , &St.gpa );
WriteFile(f , , sizeof(struct Student) , &actual , NULL);
}
CloseHandle(f);
return 0;
}
答案 0 :(得分:2)
scanf("%s %d %f" , &St.name , &St.age , &St.gpa );
name
已经衰减到指针,你不应该使用&
。
此外,它是一个宽字符串,scanf不期望。所以你会腐败。
答案 1 :(得分:0)
在WriteFile中,lpBuffer在哪里?看起来你错过了那个参数,而你就是 正如另一个答案中所指出的那样写诗人的价值。
BOOL WINAPI WriteFile(
__in HANDLE hFile,
__in LPCVOID lpBuffer,
__in DWORD nNumberOfBytesToWrite,
__out_opt LPDWORD lpNumberOfBytesWritten,
__inout_opt LPOVERLAPPED lpOverlapped
);
for(int i=0 ;i<NumOfStu;i++)
{
scanf("%s %d %f" , &St.name , &St.age , &St.gpa );
WriteFile(f , , sizeof(struct Student) , &actual , NULL);
}
答案 2 :(得分:0)
你的WriteFile调用中有一个拼写错误:我不认为这是按原样编译的。
假设您已经更正了,那么您的WriteFile调用
WriteFile(f , (LPCVOID)&St, sizeof(struct Student) , &actual , NULL);
正在编写结构的整个二进制内容。如果您打算以相同的方式阅读它,这很好。但是如果你在文本编辑器中打开文件就没有任何意义。例如,Student中的name字段将被写为20个宽字符,包括实际内容之后的空终止,以及终止后可能已经在内存中的任何垃圾。