我的问题如下:
对于学校,我必须在C中制作一个小程序来创建和修改.txt文件。我已经创建了文件并在其上书写,但是当我从中读取它以在屏幕上打印它从一开始就没有做,然后是" fisical"我的电脑中的文件全部损坏了中文字符...
我不知道发生了什么......这是我的代码:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <unistd.h>
#define SIZE 1
void clrscr()
{
system("cls");
}
int getLenght(char *Rstring)
{
int n = 0;
while(Rstring[n] != '\0')
n++;
return n;
}
void getPath(char fname[])
{
printf("Insert file path: ");
gets(fname);
fflush(stdin);
}
// Returns 0 DOESNT EXIST, 1 DOES EXIST
int fileExist(char *fname)
{
if(access(fname, F_OK) != -1)
return 1;
return 0;
}
//if manage file is NULL truncate program
FILE *manageFile(char *fname)
{
if(fileExist(fname))
return fopen(fname, "r+");
else
return fopen(fname, "w+");
}
//Returns 1 if there's an ERROR 0 if NOT
int readFile(FILE *streamf, char buffer[])
{
fflush(streamf);
fseek(streamf, -1, SEEK_SET);
fread(buffer, SIZE, sizeof(buffer), streamf);
if(ferror(streamf)){
clearerr(streamf);
return 1;
}
return 0;
}
//Returns 1 if there's an ERROR 0 if NOT
int writeFile(FILE *streamf, char buffer[])
{
int NELEMT;
printf("Insert text to input file:\n");
gets(buffer);
fflush(stdin);
NELEMT = getLenght(buffer);
fflush(streamf);
fseek(streamf, 1, SEEK_END);
fwrite(buffer, SIZE, NELEMT, streamf);
if(ferror(streamf)){
clearerr(streamf);
return 1;
}
return 0;
}
int main()
{
char fname[1000];
char buffer[1000];
char choice;
int CC = 1;
FILE *streamf = NULL;
printf("\tFILE MANAGMENT SYSTEM TEST v 1.0\n");
getPath(fname);
streamf = manageFile(fname);
if(streamf == NULL){
printf("\n\nFILE OPEN ERROR! Terminate Program");
CC = 0;
}
while(CC == 1){
clrscr();
printf("\tFILE MANAGMENT SYSTEM TEST v 1.0 - MENU\nCURRENT PATH: %s\n\n", fname);
printf("1. Read File\n2. Write File\n3. Close File\n");
choice = getch();
fflush(stdin);
switch(choice)
{
case '1':
if(readFile(streamf, buffer))
printf("\n\nREAD FILE ERROR!");
else
printf("Successfully read from the file:\n%s", buffer);
getch();
break;
case '2':
if(writeFile(streamf, buffer))
printf("\n\nWRITE FILE ERROR!");
else
printf("Successful file input");
getch();
break;
case '3':
fflush(streamf);
fclose(streamf);
CC = 0;
break;
default:
printf("\n\nOPTION NOT LISTED");
getch();
}
}
return 0;
}
答案 0 :(得分:1)
您在sizeof(buffer)
的通话中使用fread
,但它没有按照您的想法行事。看看你如何将buffer
传递给readFile
:
int readFile( FILE *streamf, char buffer[] );
这意味着buffer
只是一个指针,因此sizeof(buffer)
将等于sizeof(char*)
。这是人们用sizeof
犯下的经典错误,所以这是你的成年礼。
您需要实际传递大小到您的函数,或重新定义它以接受char buffer[1000]
。我会明确地传递一个大小:
int readFile( FILE *streamf, char buffer[], size_t buffer_size );
另外,如评论中所示,您使用的是fseek
错误。您需要对0
和SEEK_SET
使用SEEK_END
的偏移量。