从文件中读取时,我得到特殊字符,这些字符不在我的文本文件中

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 是为了我。我尝试用终端编译它,结果很好。谢谢你帮助大家。