从文件中读取时,我得到特殊字符,这些字符不在我的文本文件中
When reading from a file I get special characters, that are not in my text file
首先,我不知道这是否与我的 OS 有关,因为我在 OSx。当 运行 我的程序并打印出我从文本文件中读取的内容时,我得到以下信息:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z3`27
我正在阅读我使用 text wrangler 创建的新文本文档,我什至打开了 invisibles 以确保文件末尾没有任何内容。我用来从文本文件中读取的代码在这里:
// Parses text from file, then passes parsed text to writeAndEncode for writing and encryption.
int encode(char *fileRead, char *fileWrite) {
// Get the file
FILE *fileToRead = fopen(fileRead, "r+"); // Open file for reading
char *textWithinFile;
// Check if the file can be read
if (fileRead != NULL) {
// File can be read.
// Get length of file
fseek(fileToRead, 0L, SEEK_END);
size_t size = (size_t)ftell(fileToRead);
rewind(fileToRead);
// Make sure no error in finding size of file.
if (size != -1) {
long charSize = sizeof(char);
textWithinFile = malloc(sizeof(char) + size);
// Add text from fileToRead to char array
fread(textWithinFile, charSize, size, fileToRead);
// Add null at end to make file string
textWithinFile[size] = '[=11=]';
printf("%s\n", &textWithinFile[0]);
fclose(fileToRead); // Debugging to find out what is being read
writeAndEncode(size, textWithinFile, fileWrite);
free(textWithinFile);
} else {
//File Can't be read
printf("***ERROR_FILE_TO_READ_SIZE_CAN_NOT_BE_FOUND***\n");
}
} else {
printf("***ERROR_FILE_TO_READ_CAN_NOT_BE_READ***\n");
}
return 0;
}
如果我在 Windows 上,我会遇到同样的问题吗?
无论如何感谢您的帮助!
您需要取消注释尾随 '[=11=]'
附加
//textWithinFile[size] = '[=10=]';
我对您的代码进行了一些修改并添加了一些调试语句。它会将输入文件的内容保存到 size=(charSize*filesize+1)
的 malloc
缓冲区中,并使用 +1
位来保存空终止字符。它可以在我的机器上使用大小合理的二进制文件
您可以取消对 printf(buffer_copy)
语句的注释以了解您之前所做的事情。否则,它现在将遍历缓冲区中的每个字节并输出为它的十六进制等价物。如果您仍然得到 'junk' 那么它只是您输入文件的一部分,而不是错误。
//get the file
FILE *infp=fopen(infile,"r");
if(infp!=NULL){
//get length of file
fseek(infp,0L,SEEK_END);
size_t filesize=(size_t)ftell(infp);
printf("file length = %d\n",(int)filesize); //debug statement
rewind(infp);
if(filesize>0){
char * buffer;
buffer=(char*)malloc((sizeof(char)*filesize)+1); // +1 for null char at the end
size_t chars_read=fread(buffer,sizeof(char),filesize,infp);
printf("chars read = %d\n",(int)chars_read); // debug statement (chars_read should equal filesize)
buffer[filesize]='[=10=]'; // properly terminate the char array
fclose(infp);
//output what you read (method 1, print string)
//char *buffer_copy=buffer;
//printf("the file=\"%s\"",buffer_copy); //uncomment these two statement to do what you did before */
//output what you read (method 2, byte-by-byte)
if(chars_read>0){
int i;
for(i=0;i<chars_read;i++){
char the_char = *buffer;
printf("char%d=%02x\n",i,the_char); //output each byte as hexadecimal equivalent
buffer++;
}
} else { printf "problem with fread"; }
} else { printf("problem with filesize"); }
else { printf("problem opening the file"); }
while
循环将在第一个空终止字符处停止读取。 for
循环现在将读取文件中的每个字节(以防您试图查看不一定是 .txt
的内容,例如 .jpg
)
您是否尝试过从命令行检查文件以确保它只包含您期望的字符?
例如,通过 运行 命令 od -c
将每个字节视为其 ASCII 等价物(或八进制,如果不可打印)。
原来 Xcode 是为了我。我尝试用终端编译它,结果很好。谢谢你帮助大家。
首先,我不知道这是否与我的 OS 有关,因为我在 OSx。当 运行 我的程序并打印出我从文本文件中读取的内容时,我得到以下信息:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z3`27
我正在阅读我使用 text wrangler 创建的新文本文档,我什至打开了 invisibles 以确保文件末尾没有任何内容。我用来从文本文件中读取的代码在这里:
// Parses text from file, then passes parsed text to writeAndEncode for writing and encryption.
int encode(char *fileRead, char *fileWrite) {
// Get the file
FILE *fileToRead = fopen(fileRead, "r+"); // Open file for reading
char *textWithinFile;
// Check if the file can be read
if (fileRead != NULL) {
// File can be read.
// Get length of file
fseek(fileToRead, 0L, SEEK_END);
size_t size = (size_t)ftell(fileToRead);
rewind(fileToRead);
// Make sure no error in finding size of file.
if (size != -1) {
long charSize = sizeof(char);
textWithinFile = malloc(sizeof(char) + size);
// Add text from fileToRead to char array
fread(textWithinFile, charSize, size, fileToRead);
// Add null at end to make file string
textWithinFile[size] = '[=11=]';
printf("%s\n", &textWithinFile[0]);
fclose(fileToRead); // Debugging to find out what is being read
writeAndEncode(size, textWithinFile, fileWrite);
free(textWithinFile);
} else {
//File Can't be read
printf("***ERROR_FILE_TO_READ_SIZE_CAN_NOT_BE_FOUND***\n");
}
} else {
printf("***ERROR_FILE_TO_READ_CAN_NOT_BE_READ***\n");
}
return 0;
}
如果我在 Windows 上,我会遇到同样的问题吗?
无论如何感谢您的帮助!
您需要取消注释尾随 '[=11=]'
附加
//textWithinFile[size] = '[=10=]';
我对您的代码进行了一些修改并添加了一些调试语句。它会将输入文件的内容保存到 size=(charSize*filesize+1)
的 malloc
缓冲区中,并使用 +1
位来保存空终止字符。它可以在我的机器上使用大小合理的二进制文件
您可以取消对 printf(buffer_copy)
语句的注释以了解您之前所做的事情。否则,它现在将遍历缓冲区中的每个字节并输出为它的十六进制等价物。如果您仍然得到 'junk' 那么它只是您输入文件的一部分,而不是错误。
//get the file
FILE *infp=fopen(infile,"r");
if(infp!=NULL){
//get length of file
fseek(infp,0L,SEEK_END);
size_t filesize=(size_t)ftell(infp);
printf("file length = %d\n",(int)filesize); //debug statement
rewind(infp);
if(filesize>0){
char * buffer;
buffer=(char*)malloc((sizeof(char)*filesize)+1); // +1 for null char at the end
size_t chars_read=fread(buffer,sizeof(char),filesize,infp);
printf("chars read = %d\n",(int)chars_read); // debug statement (chars_read should equal filesize)
buffer[filesize]='[=10=]'; // properly terminate the char array
fclose(infp);
//output what you read (method 1, print string)
//char *buffer_copy=buffer;
//printf("the file=\"%s\"",buffer_copy); //uncomment these two statement to do what you did before */
//output what you read (method 2, byte-by-byte)
if(chars_read>0){
int i;
for(i=0;i<chars_read;i++){
char the_char = *buffer;
printf("char%d=%02x\n",i,the_char); //output each byte as hexadecimal equivalent
buffer++;
}
} else { printf "problem with fread"; }
} else { printf("problem with filesize"); }
else { printf("problem opening the file"); }
while
循环将在第一个空终止字符处停止读取。 for
循环现在将读取文件中的每个字节(以防您试图查看不一定是 .txt
的内容,例如 .jpg
)
您是否尝试过从命令行检查文件以确保它只包含您期望的字符?
例如,通过 运行 命令 od -c
将每个字节视为其 ASCII 等价物(或八进制,如果不可打印)。
原来 Xcode 是为了我。我尝试用终端编译它,结果很好。谢谢你帮助大家。