我想迭代一个文件列表,而不关心文件名可能包含哪些字符,所以我使用一个由空字符分隔的列表.代码将更好地解释事情.
# Set IFS to the null character to hopefully change the for..in
# delimiter from the space character (sadly does not appear to work).
IFS=$'\0'
# Get null delimited list of files
filelist="`find /some/path -type f -print0`"
# Iterate through list of files
for file in $filelist ; do
# Arbitrary operations on $file here
done
Run Code Online (Sandbox Code Playgroud)
从文件读取时,以下代码有效,但我需要从包含文本的变量中读取.
while read -d $'\0' line ; do
# Code here
done < /path/to/inputfile
Run Code Online (Sandbox Code Playgroud) 在尝试通过使用NULL字符作为分隔符来正确处理文件//foldernames列表(请参阅我的其他问题)时,我偶然发现了Bash的一个奇怪的行为,我不明白:
将包含一个或多个NULL字符的字符串分配给变量时,将丢失/忽略/不存储NULL字符.
例如,
echo -ne "n\0m\0k" | od -c # -> 0000000 n \0 m \0 k
Run Code Online (Sandbox Code Playgroud)
但:
VAR1=`echo -ne "n\0m\0k"`
echo -ne "$VAR1" | od -c # -> 0000000 n m k
Run Code Online (Sandbox Code Playgroud)
这意味着我需要将该字符串写入文件(例如,在/ tmp中),如果不希望或不可行直接管道,则从那里读回.
在Z shell(zsh)中执行这些脚本时,在两种情况下都会保留包含\ 0的字符串,但遗憾的是我不能假设在运行我的脚本的系统中存在zsh而Bash应该是.
如何在不丢失任何(元)字符的情况下有效地存储或处理包含\ 0字符的字符串?
这是一个棘手的问题.我怀疑它需要一些文件系统的高级知识才能回答.
我有一个针对.NET framework 4.0的WPF应用程序"App1".它有一个Settings.settings文件,用于生成App1.exe.config存储默认设置的标准文件.当用户修改设置时,修改将进入AppData\Roaming\MyCompany\App1\X.X.0.0\user.config.这是所有标准的.NET行为.但是,有时,我们发现user.config客户机器上的文件不是应该的,导致应用程序崩溃.
问题看起来像这样:user.config如果用XML填充它应该是大小,但是它只是一堆NUL字符而不是XML.它的角色0一遍又一遍地重复着.我们没有关于导致此文件修改的内容的信息.
如果我们只是删除,我们可以在客户的设备上修复该问题,user.config因为公共语言运行时只会生成一个新问题.他们将失去他们对设置所做的更改,但可以再次进行更改.
但是,我在另一个带有另一个XML文件的WPF应用程序"App2"中遇到了这个问题info.xml.这次是不同的,因为文件是由我自己的代码而不是CLR生成的.常见的主题是两个都是C#WPF应用程序,都是XML文件,在这两种情况下,我们完全无法在测试中重现问题.这可能与C#应用程序与XML文件或文件交互的方式有关吗?
我们不仅无法在当前的应用程序中重现该问题,而且我甚至无法通过编写有意产生错误的自定义代码来重现该问题.我找不到单个XML序列化错误或文件访问错误导致文件填充空值.那么可能会发生什么?
App1 user.config通过调用Upgrade()以及Save()获取和设置属性来访问.例如:
if (Settings.Default.UpgradeRequired)
{
Settings.Default.Upgrade();
Settings.Default.UpgradeRequired = false;
Settings.Default.Save();
}
Run Code Online (Sandbox Code Playgroud)
info.xml通过序列化和反序列化XML来访问App2 :
public Info Deserialize(string xmlFile)
{
if (File.Exists(xmlFile) == false)
{
return null;
}
XmlSerializer xmlReadSerializer = new XmlSerializer(typeof(Info));
Info overview = null;
using (StreamReader file = new StreamReader(xmlFile))
{
overview = (Info)xmlReadSerializer.Deserialize(file);
file.Close();
}
return overview;
}
public void …Run Code Online (Sandbox Code Playgroud) 有两个string变量,m和n:
#include <string>
string m = "0100700\0"
cout << m.size() << endl; // it prints: 7
string n;
n += "0100700"
n += '\0';
cout << n.size() << endl; // it prints: 8
Run Code Online (Sandbox Code Playgroud)
我猜两个都有8个字符,但m只有7个字符,n有8个字符.为什么会这样?
我正在刷我的C++,偶然发现了一个关于字符串,字符数组和空字符('\0')的奇怪行为.以下代码:
#include <iostream>
using namespace std;
int main() {
cout << "hello\0there"[6] << endl;
char word [] = "hello\0there";
cout << word[6] << endl;
string word2 = "hello\0there";
cout << word2[6] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产生输出:
> t
> t
>
Run Code Online (Sandbox Code Playgroud)
幕后发生了什么?为什么字符串文字和声明的char数组存储't'at索引6(在内部之后'\0'),但声明的字符串不存在?
我一直在使用Java的BufferedWriter来写一个文件来解析一些输入.但是,当我打开文件后,似乎添加了空字符.我尝试将编码指定为"US-ASCII"和"UTF8",但我得到了相同的结果.这是我的代码片段:
Scanner fileScanner = new Scanner(original);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "US-ASCII"));
while(fileScanner.hasNextLine())
{
String next = fileScanner.nextLine();
next = next.replaceAll(".*\\x0C", ""); //remove up to ^L
out.write(next);
out.newLine();
}
out.flush();
out.close();
Run Code Online (Sandbox Code Playgroud)
也许问题甚至不是BufferedWriter?
我把它缩小到这个代码块,因为如果我将它注释掉,输出文件中就没有空字符.如果我在VIM中进行正则表达式替换,则该文件为null-character free(:%s /.*^ L // g).
如果您需要更多信息,请与我们联系.
谢谢!
编辑: 正常线的hexdump看起来像:0000000 5349 2a41 3030 202a
但是当运行此代码时,hexdump看起来像:0000000 5330 2a49 4130 202a
我不确定为什么事情变得混乱了.
编辑: 此外,即使文件与正则表达式不匹配并贯穿该代码块,它也会出现空字符.
编辑: 这是差异的前几行的十六进制:http: //pastie.org/pastes/8964701/text
命令是:diff -y testfile.hexdump expectedoutput.hexdump
其余的线条与最后两条线条不同.
在任何人说,"不要这样做,因为它真的很糟糕".
char mystr[] = { 'm', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g'};
但是,c-string表示的便利性太大了.这样做的理由是我正在为微控制器编程,我需要将数据存储到程序的内存中.一些数据是字节,单词,双字和浮点数的形式.我希望数据包含没有NUL连续的字符串.
我已经尝试了将<size_t N,char*A>和<size_t N,char(&A)[N]>作为参数的模板,以便遍历数组并将其内容存储到静态数组中,但我不能似乎做对了.我认为标准可能实际上不允许这种情况在一般情况下是可以理解的,但在特定情况下是不幸的(具体来说,这个.;):()
如果我可以将字符串重新映射为类似boost :: mpl :: vector_c <char,...>模板的东西,那会更好,因为我有其他代码可以正确存储它,但是从模板中取消引用数组到用作const模板参数似乎也是不允许的.
有任何想法吗?
编辑:
Psudocode示例(这有点人为,因为实际代码要大得多,我也不会像这样逐字节读取,也不会使用文字迭代到字符串的末尾.这将嵌入到数据以及某处.):
// this stores bytes in an array
template<typename X, typename T, T ...numbers>
struct x
{
static PROGMEM volatile const T data[];
};
template<typename X, typename T, T ...numbers>
PROGMEM volatile const T x<X, T, numbers...>::data[] = { numbers... };
void main()
{ …Run Code Online (Sandbox Code Playgroud) 我试图理解下面的一段代码,但我"\0"和之间感到困惑'\0'.我知道它很傻但善意帮助我
#define MAX_HISTORY 20
char *pStr = "\0";
for(x=0;x<MAX_HISTORY;x++){
str_temp = (char *)malloc((strlen(pStr)+1)*sizeof(char));
if (str_temp=='\0'){
return 1;
}
memset(str_temp, '\0', strlen(pStr) );
strcpy(str_temp, pStr);
Run Code Online (Sandbox Code Playgroud) NUL字符吗?chrorchar功能。