2012-03-30 81 views
0

我想创建一个文本文件并写入它,但是当我打开文本文件输出出错了。我在写入Windows中的文件时遇到问题?

样品:

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; 
} 
+1

您对'WriteFile'的调用看起来很有趣,但缺少一个参数。 – Mat 2012-03-30 14:36:56

回答

2
    scanf("%s %d %f" , &St.name , &St.age , &St.gpa); 

name已经衰减到一个指针,你不应该使用&机智h it。

此外,它是一个很宽的字符串,scanf并不期望。所以你会得到腐败。

+0

我不确定这是否有帮助 – 2012-03-30 14:42:56

+0

@Mz:它没有帮助你,因为你不明白它,因为你不知道如何使用这些信息来修复你的程序,或者因为你已经知道这个和你的真正的程序没有这些问题? – 2012-03-30 15:55:34

0

在WriteFile中,lpBuffer在哪里?它看起来像你缺少那个参数,并且你正在编写poiner值,正如另一个答案中指出的那样。

WriteFileFunction

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); 
    } 
0

你有一个错字在你的WriteFile来电:我不希望因为这是编译。

假设您已经纠正了,你的电话WriteFile的

WriteFile(f , (LPCVOID)&St, sizeof(struct Student) , &actual , NULL); 

的书写结构的整个二进制内容。如果你打算以相同的方式阅读它,这很好。但是,如果您在文本编辑器中打开该文件,这将毫无意义。例如,Student中的名称字段将被写为20个宽字符,包括实际内容之后的空终止以及终止后可能在内存中的任何垃圾。

+1

这是一个无用的演员。 – 2012-03-30 15:49:35

+0

@本Voigt:这是一个不必要的演员,但也许不是一个无用的演员。我想强调WriteFile需要一个void *并且不理解struct Student的内部布局。 – 2012-04-02 18:34:54

+0

它比无用的更糟糕,它完全有害。如果您忘记了'&',那么转换可能导致它在没有警告的情况下进行编译,并将积分数据视为指针,导致运行时数据损坏。如果您离开演员阵容,编译器会正确接受任何指针,但拒绝非指针变量。 – 2012-04-02 19:01:25